You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:45:07