TypeScript enum索引校验:赋值未定义枚举值无报错原因及强制规范方案
问题1解答
这是TypeScript针对数字枚举的默认设计特性:
为了兼容数字枚举的位运算、复合值赋值等常见使用场景,TS默认不会对数字枚举做严格的数值校验,任意数字都可以直接赋值给数字枚举类型,不会触发类型错误。只有字符串枚举会要求赋值必须是已定义的枚举成员值。
问题2解答
可以通过以下方案实现要求的强制校验:
方案1(无额外依赖,推荐)
用as const常量对象替代原生枚举,在原生TS层面就可以实现严格的类型校验:
export const ResponseCodes = { 'Network error': 5003 } as const; // 导出对应值类型 export type ResponseCodes = typeof ResponseCodes[keyof typeof ResponseCodes];
调整后以下写法会触发TS类型错误:
// 报错:类型“4000”不能分配给类型“5003” const code: ResponseCodes = 4000;
如果要进一步强制必须通过枚举成员访问的形式赋值,禁止直接写5003这类字面量赋值,开启ESLint的no-magic-numbers规则即可,所有数字字面量的直接赋值都会被拦截,只能通过ResponseCodes['Network error']的形式取值。
方案2(保留原有枚举写法)
如果不想修改现有枚举代码,可以接入ESLint的@typescript-eslint/prefer-enum-member-access规则,强制所有枚举类型的变量赋值必须通过枚举成员访问的形式完成,配合TS严格模式即可覆盖需求。
内容的提问来源于stack exchange,提问作者Anton Matiash
相关产品推荐
相关产品推荐

