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

TypeScript中能否将枚举值作为对象的键使用?

问题解答

结论:你提到的第二种带计算属性的写法是唯一符合预期的正确写法,第一种不带方括号的写法不仅类型不匹配,运行时也无法得到正确结果。

两种写法的差异说明

第一种写法(无方括号)

static readonly statusMapping: { [key in UploadStatus]: PopupMessageStatus } = {
    UploadStatus.COMPLETED : PopupMessageStatus.COMPLETED
}
  • 编译阶段:TS 会直接抛出类型错误。对象字面量中未用方括号包裹的键会被默认识别为字符串字面量,也就是这里的键是字符串"UploadStatus.COMPLETED",和你定义的类型要求的UploadStatus数字类型键完全不匹配。
  • 运行阶段:就算强制绕过类型检查编译成功,实际生成的对象键是字符串"UploadStatus.COMPLETED",你用statusMapping[UploadStatus.COMPLETED](也就是statusMapping[0])取值时会得到undefined,完全无法满足业务需求。

第二种写法(带方括号计算属性)

static readonly statusMapping: { [key in UploadStatus]: PopupMessageStatus } = {
    [UploadStatus.COMPLETED]: PopupMessageStatus.COMPLETED
}
  • 编译阶段:计算属性会先对UploadStatus.COMPLETED求值,得到对应的数字枚举值,完全匹配你定义的类型要求,不会有类型报错。
  • 运行阶段:对象的键是实际的枚举值0,用枚举值作为索引可以正常取出对应的值,符合预期。

补充说明

如果你的枚举是字符串枚举(成员值为字符串),两种写法的差异会更明显:不带方括号的写法键是枚举成员名称的字符串,带方括号的写法键是枚举成员的实际值,二者完全不同。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:36:03