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

