为什么TypeScript数值枚举允许非枚举值赋值而字符串枚举不允许?
原因解释
这是 TypeScript 刻意设计的枚举类型差异规则,核心差异来自两种枚举的使用场景定位和类型实现逻辑:
- 数值枚举的宽松校验逻辑
数值枚举从设计之初就考虑了位运算、自定义状态码等扩展场景,开发者经常需要给数值枚举变量传入定义外的合法数值。因此 TypeScript 不会对数值枚举做严格的成员值校验,只要是number类型的值都可以赋值给数值枚举类型的变量,不会抛出错误。 - 字符串枚举的严格校验逻辑
字符串枚举没有数值枚举的扩展使用场景,它的本质是字符串字面量类型的联合。你定义的Dir字符串枚举,在类型层面等价于type Dir = 'Up' | 'Down',赋值不在联合类型范围内的'Left'时,自然会触发类型报错。
如果你需要数值枚举也做严格校验
可以用 as const 定义常量对象模拟枚举,实现严格的取值校验:
const Dir = { Up: 1, Down: 2 } as const; // 此时Dir类型等价于 1 | 2 type Dir = typeof Dir[keyof typeof Dir]; let dir: Dir; dir = 3 // 这里会触发类型错误
内容的提问来源于stack exchange,提问作者ino
相关产品推荐
相关产品推荐

