如何基于Enum创建对象类型?解决TS索引签名报错问题
解决TypeScript枚举键映射对象类型的报错问题
首先把你遇到的错误信息翻译为中文:
错误:索引签名参数类型不能是字面量类型或泛型类型。请考虑改用映射对象类型。ts(1337)
问题原因
你使用普通索引签名{[key:hotkey]: string}时,TypeScript不允许索引参数是枚举键这类字面量联合类型,必须用映射对象类型来实现枚举键的约束。
解决方案
方案1:使用Record工具类型(最简写法)
Record是TypeScript内置工具类型,专门用于定义“键属于某个集合、值为统一类型”的对象:
export enum Hotkey { MARK_IN = 'markIn', MARK_OUT = 'markOut', GO_TO_MARK_IN = 'goToMarkIn', GO_TO_MARK_OUT = 'goToMarkOut' } // 约束键只能是Hotkey的枚举成员名,值为string类型 type Clone = Record<keyof typeof Hotkey, string> // 如果允许只包含枚举中的部分键(可选),用Partial包裹 // type Clone = Partial<Record<keyof typeof Hotkey, string>> const finalObject: Clone = { MARK_IN: 'markIn', MARK_OUT: 'markOut', GO_TO_MARK_IN: 'goToMarkIn', GO_TO_MARK_OUT: 'goToMarkOut' };
方案2:手动写映射类型
如果不想依赖内置工具类型,可以手动编写映射逻辑,效果和Record完全一致:
type HotkeyKeys = keyof typeof Hotkey; // 遍历HotkeyKeys中的每个键,值类型为string type Clone = { [K in HotkeyKeys]: string; } // 可选版本(允许只存在部分枚举键) // type Clone = { // [K in HotkeyKeys]?: string; // }
验证效果
定义好Clone类型后:
- 只能使用
Hotkey枚举中的成员名作为对象键,添加其他键会直接触发TypeScript报错 - 对象值的类型会被严格约束为
string(如需其他类型,替换对应位置即可)
内容的提问来源于stack exchange,提问作者Niranjan
相关产品推荐
相关产品推荐

