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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:15:42