打字稿字符串和字符串枚举 - 字符串不可分配

Typescript strings and string enums - string not assignable

Typescript 手册并没有真正给我太多关于如何正确使用字符串枚举的信息。
Here 是我的例子:

enum ICE_CREAM {
    strawberry = "STRAWBERRY",
    vanilla = "VANILLA"
}

type TORDER = {
    greetings: string,
    flavor: ICE_CREAM
}

const mockData: TORDER = {
    greetings: "Hello",
    flavor: "VANILLA",
}

导致错误类型

'"VANILLA"' is not assignable to type 'ICE_CREAM'.(2322)

我的后端将发送包含“flavor”键的数据,我想确保它的值是我的 ICE_CREAM 字符串枚举中声明的值之一。我做错了什么?

根据设计,您不能将字符串分配给类型为枚举的 属性。您必须引用枚举才能分配其值之一。

flavor: ICE_CREAM.vanilla

但是,使用字符串联合类型是一种更好的方法。这样你可以保持你的类型强大,同时让你的字符串成为字符串。

type ICE_CREAM = 'STRAWBERRY' | 'VANILLA';

type TORDER = {
    greetings: string,
    flavor: ICE_CREAM
}

const mockData: TORDER = {
    greetings: "Hello",
    flavor: "VANILLA", // Assigns without error
}

const badMockData: TORDER = {
  greetings: "Hello",
  flavor: "vanilla", // Error: flavor can only be 'STRAWBERRY' or 'VANILLA'
}

直觉上您似乎应该能够使用底层字符串,因为毕竟它们是相同的,对吗?

然而,它们在语义上并不相同。以这个enum为例:

enum SILLY_PROGRAMMER {
    ten = "TEN",
    twenty = "TWENTY"
}

假设一些程序员在他们的 1000 多行代码中使用了这个枚举,然后他们突然意识到他们犯了一个错误!他们的原始代码实际上是这样的:

enum SILLY_PROGRAMMER {
    ten = "TWENTY",
    twenty = "TEN"
}

哦不!现在他们将不得不重写一切,对吧?错了,他们只需要更改枚举。这在您编写 API 并且在返回的常量数据中有一些错误时特别有用,只需更改枚举。

然而,如果没有这个,它不会自动更新,而是类型不匹配。这意味着您必须去哪里看到错误并手动更正它。

因此,这就是做出此决定的原因,以及如果您想拥有上述行为,它就是做出“正确”决定的原因。