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

TypeScript能否用enum限制属性值?为何校验未生效?

现象底层逻辑

这是TypeScript针对数字枚举的特殊类型兼容性设计导致的,和联合字面量的检查规则完全不同:

  • 你最初使用的0 | 1是精确值联合类型,TypeScript会严格校验赋值是否在枚举的取值范围内,因此赋值100会直接抛出错误。
  • 数字枚举本质上是number的子类型,TypeScript允许任意number类型的值赋值给数字枚举类型,不会做精确值校验。该设计的初衷是为了兼容数字枚举的位运算使用场景:比如定义位标识枚举后,多个枚举值做位或运算得到的组合值,也可以合法赋值给枚举类型,如果做精确值校验,这类合法使用场景就会报错。

实现严格校验的方案

如果既想避免魔法数,又需要和字面量联合一样的精确值校验,可以用as const定义常量集合替代枚举:

const Gender = {
  MALE: 1,
  FEMALE: 0
} as const

// 提取取值类型,等价于 0 | 1
type Gender = typeof Gender[keyof typeof Gender]

type GenderConfig = {
  gender: Gender
}

const obj: GenderConfig = {
  gender: 100 // 会正常抛出类型错误
}

内容的提问来源于stack exchange,提问作者Isaac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:54:02