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

typescript - string literal type to type string

本文关键字:类型 字符串 文字 Typescript      更新时间:2023-09-26

我有一个string literal type guard

方法
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)
}

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

这段代码将被编译成如下内容:

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

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

可以将Status设置为enum吗?然后您可以使用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);