typescript - 用于输入字符串的字符串文字类型

Mon*_*sto 3 javascript string typeliteral typescript

我有一个带有字符串文字类型保护的方法

type Status = 'new' | 'update' | 'close';

itemRequest(status: Status) { 
    itemService.subscribeToChanges(status) //third party library method
}
Run Code Online (Sandbox Code Playgroud)

我遇到的困难是这个第三方方法接受字符串而不是我的自定义字符串类型 Status

subscribeToChanges(status: string) 
Run Code Online (Sandbox Code Playgroud)

如何使我的字符串文字实际上是字符串类型以及何时传递给第三方方法。它明白它实际上是一个字符串吗?

Dan*_*try 5

您可以将您的值转换为Status这样的字符串:

type Status = 'new' | 'update' | 'close';

itemRequest(status: Status) { 
    itemService.subscribeToChanges(status as string)
}
Run Code Online (Sandbox Code Playgroud)

千万不能使用String(status)。这构造了一个新string对象,status并且是一种浪费的分配。强制转换将在运行时被删除,只是更正 TypeScript 对status变量类型的了解。请记住,TypeScript 所做的任何类型检查都是在编译时完成的,并且没有运行时成本或存在。

此代码将被编译为以下内容:

itemRequest(status) {
  itemService.subscribeToChanges(status)
}
Run Code Online (Sandbox Code Playgroud)

然而,我对为什么会发生这种情况感到困惑。您的类型别名都是类型,string因此从Statusto 转换string应该是向上转换(即,在任何合理的类型检查器下都是允许的)。相反,将是主要问题。实际上,您的原始代码本身就可以正常工作。


Ale*_* C. 0

您可以将 Status 设置为枚举吗?然后您可以使用Status[status]您期望的字符串值。IE

enum Status { new, update, close }

itemRequest(status: Status) { 
    itemService.subscribeToChanges(Status[status]) //third party library method
}
Run Code Online (Sandbox Code Playgroud)