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

Mar*_*ark 5 enums typescript

假设我有一个数字枚举:

const enum EStatus {
   Busy = 0,
   Available = 1,
   Away = 2  
}
Run Code Online (Sandbox Code Playgroud)

当我执行以下操作时,TypeScript不会抱怨:

const status: EStatus = 4
Run Code Online (Sandbox Code Playgroud)

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

const enum EDayOfWeekend {
   Saturday = "Saturday",
   Sunday = "Sunday"
}
Run Code Online (Sandbox Code Playgroud)

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

const dayOfWeekend: EDayOfWeekend = "Tuesday"
Run Code Online (Sandbox Code Playgroud)

我本来希望 TypeScript 要么允许两者都允许,要么不允许两者都允许。IMO应该不会允许超过所定义的值以外的任何使用,甚至更好地执行,你只能使用枚举本身初始化变量,例如

const dayOfWeekend = EDayOfWeekend.Saturday
Run Code Online (Sandbox Code Playgroud)

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

Tit*_*mir 5

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

该行为是由按位运算驱动的。有些时候 SomeFlag.Foo | SomeFlag.Bar 旨在生成另一个 SomeFlag。相反,您最终得到的是 number,并且您不想强制转换回 SomeFlag`。我想如果我们再做一次 TypeScript 并且仍然有枚举,我们就会为位标志创建一个单独的构造。