TypeScript使用enum作为对象类型键时出现computed property name报错如何解决
报错原因
- 语法规则冲突:
[key in 类型]属于TypeScript的映射类型语法,不能和普通静态属性声明写在同一个对象类型字面量中,必须通过交叉类型合并两类属性的定义。 - 枚举定义错误:你当前定义的
CID是默认数字枚举,成员实际值为0、1、2,并非你预期的国家字符串前缀,即便语法修正后也无法匹配sg、tw这类字符串键。
修复方案
第一步:修正键的类型定义,保证值为对应的国家前缀字符串,两种写法可选:
// 写法1:字符串枚举,适合需要枚举特性的场景 enum CID { tw = 'tw', sg = 'sg', vn = 'vn', } // 写法2:字符串字面量联合类型,代码更简洁,适合简单的键集合场景 type CID = 'tw' | 'sg' | 'vn'
第二步:用交叉类型合并必填的default属性和可选的国家前缀属性定义,也可以借助Record工具类型简化代码:
interface IIndividualConfig { master: 0 | 1; } // 完整写法:手写映射类型 + 交叉类型 type IConfig = { default: IIndividualConfig; } & { [key in CID]?: IIndividualConfig; } // 简化写法:借助Record工具类型,效果完全一致 type IConfig = { default: IIndividualConfig } & Partial<Record<CID, IIndividualConfig>>
验证效果
// 合法配置可正常通过校验 const configOne: IConfig = { default: { master: 0 }, sg: {master: 1} } const configTwo: IConfig = { default: { master: 1 } } // 非法国家前缀会触发类型报错,符合预期 const invalidConfig: IConfig = { default: { master: 1 }, jp: { master: 0 } // 报错:对象字面量只能指定已知属性,"jp" 不在类型 "IConfig" 中 }
内容的提问来源于stack exchange,提问作者Isaac
相关产品推荐
相关产品推荐

