繁体   English   中英

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

[英]typescript - string literal type to type string

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

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

itemRequest(status: Status) { 
    itemService.subscribeToChanges(status) //third party library method
}

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

subscribeToChanges(status: string) 

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

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

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

itemRequest(status: Status) { 
    itemService.subscribeToChanges(status as string)
}

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

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

itemRequest(status) {
  itemService.subscribeToChanges(status)
}

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

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

enum Status { new, update, close }

itemRequest(status: Status) { 
    itemService.subscribeToChanges(Status[status]) //third party library method
}

它应该工作。 在 JavaScript 中,它是一个普通的字符串。 查看此示例或在操场上访问它。

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

function itemRequest(status: Status) { 
    itemService.subscribeToChanges(status) //third party library method
}
let myStatus: Status = 'update';
itemRequest(myStatus);

// Compiled JavaScript
function itemRequest(status) {
    itemService.subscribeToChanges(status); //third party library method
}
var myStatus = 'update';
itemRequest(myStatus);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM