TypeScript - 字符串字面量类型转换为类型字符串

5
我有一个带有字符串文字类型保护的方法。
type Status = 'new' | 'update' | 'close';

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

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

subscribeToChanges(status: string) 

如何使我的字符串字面量实际上是字符串类型,并且当我将其传递给第三方方法时,它能够理解它实际上是一个字符串?


1
具体问题是什么?当传递 status 时,您遇到了编译错误?是什么错误?我无法重现它。 - Nitzan Tomer
3个回答

5

您可以像这样将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类型,因此从Status转换为string应该是上转换(在任何合理的类型检查器下都是允许的)。反过来则是主要问题。实际上,您原始的代码本身完全可以正常工作。


它应该被转换为小写的 string,而不是大写的 String。请参见 https://dev59.com/-WUq5IYBdhLWcg3wKtXs - jeffkmeng

0

你能把状态做成枚举类型吗?那么你就可以使用Status[status],它将是你期望的字符串值。

enum Status { new, update, close }

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

我认为如果您没有明确地给枚举类型赋字符串,那么在运行时这些值将会是数字。请参阅枚举类型手册页面中的第二段。 - MaxAxeHax

0

应该可以工作。在JavaScript中,它是一个普通的字符串。查看此示例或访问{{link1: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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接