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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:18:02