typescript - 字符串文字类型到字符串类型

时间:2016-11-16 19:18:01

标签: javascript string typescript typeliteral

我有一个字符串文字类型保护

的方法
type Status = 'new' | 'update' | 'close';

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

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

subscribeToChanges(status: string) 

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

3 个答案:

答案 0 :(得分:1)

您可以将Status的值转换为如下字符串:

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

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

使用String(status)。这会从String构造一个新的status对象,这是一个浪费的分配。演员表将在运行时被删除,只是纠正了TypeScript对status变量类型的了解。请记住,任何检查TypeScript的类型都是在编译时完成的,没有运行时成本也没有。

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

itemRequest(status) {
  itemService.subscribeToChanges(status)
}
然而,我很困惑为什么会这样。您的类型别名都是String类型,因此从StatusString的转换应该是向上转换(即在任何合理类型的检查器下允许)。另一种方式是主要问题。实际上,您的原始代码可以自行运行。

答案 1 :(得分:0)

你能把状态变成枚举吗?然后你可以使用Status[status]这将是你期望的字符串值。 即。

enum Status { new, update, close }

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

答案 2 :(得分:0)

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

// 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);