Typescript给包含枚举值的数组分配了错误的类型



代码如下:

enum AnimalId {
Dog = 2,
Cat = 3
}
const animalIds: AnimalId[] = [AnimalId.Dog, 4];

为什么Typescript没有显示id 4不能分配给类型AnimalId[]的错误?

行为差异的主要原因是具有标志号枚举和对其使用位操作符的能力。对于字符串枚举,没有等效的特性。

以下是Daniel Rosenwasser对GH的推理:

该行为是由位操作驱动的。有些时候SomeFlag。Foo | SomeFlag。Bar旨在生成另一个SomeFlag。相反,你最终得到number,而你不想进行强制转换回到SomeFlag’。我想如果我们再做一次TypeScript如果有枚举,我们会为位标志单独构造。

你可以用字符串代替数字来解决这个问题:

enum AnimalId {
Dog = "2",
Cat = "3"
}
const animalIds: AnimalId[] = [AnimalId.Dog, 4]; // ❌ Type 'number' is not assignable to type 'AnimalId'.

TS Playground: https://www.typescriptlang.org/play?#code/KYOwrgtgBAgiCWECGAbAkgEygbwFBSgBEB7AcygF4oAiAJmoBp8oBhJAF0poGZrcBfXLgDGxEAGdOSBMnQZxALlgzUmANoBdLmriJVGAHQlSDKABYNAblxA