【问题标题】:Number enum in TypeScript allows any number whereas string enum does notTypeScript 中的数字枚举允许任何数字,而字符串枚举不允许
【发布时间】:2018-11-27 09:41:33
【问题描述】:

假设我有一个数字枚举:

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 中存在这种不一致,以及它是否是设计使然。

【问题讨论】:

    标签: typescript enums


    【解决方案1】:

    行为差异的主要原因是能够拥有标志编号枚举并在其上使用位运算符。对于字符串枚举,没有等效的功能。在这个 GhitHub issueDaniel Rosenwasser 中,编译器团队的推理很清楚:

    这种行为是由位运算驱动的。有时 SomeFlag.Foo | SomeFlag.Bar 旨在生成另一个 SomeFlag。相反,您最终会得到数字,并且您不想强制转换回 SomeFlag`。 我认为如果我们重新编写 TypeScript 并且仍然有枚举,我们会为位标志创建一个单独的构造。

    【讨论】:

      猜你喜欢
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多