如何定义以枚举值为键的对象类型?TypeScript报错解决
问题原因分析
这个TS2322错误的核心是你混淆了keyof Enum1的含义:对于const enum来说,keyof Enum1获取的是枚举的成员名称(也就是"key1"、"key2"、"key3"),但你定义obj1时用的是枚举的值(比如Enum1.key1对应的"value1")作为对象键,两者类型不匹配,所以TypeScript报错说[Enum1.key1]这个键不存在于ObjType中。
方法1:让ObjType的键为枚举的所有值
要定义键为枚举值的类型,你需要先获取枚举值的联合类型,再用它构建索引类型:
export const enum Enum1 { key1 = 'value1', key2 = 'value2', key3 = 'value3', } // 获取Enum1所有值的联合类型:'value1' | 'value2' | 'value3' type Enum1Values = Enum1[keyof Enum1]; // 用枚举值作为键定义ObjType type ObjType = { [K in Enum1Values]: { some_object: number } }; export const obj1: ObjType = { [Enum1.key1]: { some_object: 123 }, [Enum1.key2]: { some_object: 123 }, [Enum1.key3]: { some_object: 123 }, };
这样TypeScript就能正确识别obj1的键是枚举值,和ObjType的类型完全匹配,错误会直接消失。
方法2:确保对象包含枚举所有值的键(兜底方案)
如果因为特殊场景限制无法直接定义键为枚举值的类型,可以用辅助函数强制约束对象必须覆盖所有枚举值的键:
export const enum Enum1 { key1 = 'value1', key2 = 'value2', key3 = 'value3', } type Enum1Values = Enum1[keyof Enum1]; type ObjType = { [K in Enum1Values]: { some_object: number } }; // 辅助函数:约束传入对象必须包含所有Enum1值的键 function createEnumObj(obj: ObjType): ObjType { return obj; } // 少写任意一个键都会触发TypeScript错误 export const obj1 = createEnumObj({ [Enum1.key1]: { some_object: 123 }, [Enum1.key2]: { some_object: 123 }, [Enum1.key3]: { some_object: 123 }, });
这个方式利用类型约束,能自动检查对象是否覆盖了所有枚举值的键,比手动声明类型更严谨。
内容的提问来源于stack exchange,提问作者Stav Alfi
相关产品推荐
相关产品推荐

