TypeScript中的数字枚举允许任何数字,而字符串枚举不允许

时间:2018-11-27 09:41:34

标签: typescript enums

说我有一个数字枚举:

const enum EStatus {
   Busy = 0,
   Available = 1,
   Away = 2  
}
当我执行以下操作时,

TypeScript 不会抱怨:

const status: EStatus = 4

但是,如果我有一个字符串枚举:

const enum EDayOfWeekend {
   Saturday = "Saturday",
   Sunday = "Sunday"
}

然后,当我尝试执行以下操作时,TypeScript 抱怨:

const dayOfWeekend: EDayOfWeekend = "Tuesday"

我希望TypeScript在允许或不允许两者方面保持一致。 IMO应该不允许使用除已定义的值以外的任何方式,甚至更好地强制您只能使用枚举本身来初始化变量,例如

const dayOfWeekend = EDayOfWeekend.Saturday

我想知道为什么TypeScript内部存在这种不一致,以及是否有意设计这种不一致。

1 个答案:

答案 0 :(得分:3)

行为不同的主要原因是具有标志号枚举并对其使用按位运算符的能力。对于字符串枚举,没有等效功能。在此GhitHub issue中,丹尼尔·罗森瓦瑟(Daniel Rosenwasser)明确了编译器团队的推理:

  

该行为是由按位运算引起的。有时SomeFlag.Foo | SomeFlag.Bar用于生成另一个SomeFlag。相反,您最终得到的是数字,并且您不想强制回退到SomeFlag`。   我认为,如果我们再次执行TypeScript并仍然有枚举,那么我们将为位标志建立一个单独的构造。