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
相关产品推荐
相关产品推荐

