TypeScript索引签名参数类型报错:无法使用联合类型,如何解决?
解决TypeScript索引签名不能用联合类型的问题
你的思路其实很合理,但TypeScript对索引签名有明确限制:索引签名的参数类型只能是string、number、symbol,或者这些类型的单一字面量类型,不能是联合类型——哪怕这个联合类型来自枚举也不行。你定义的Option枚举展开后本质是'one' | 'two' | 'three'这样的字符串字面量联合,所以触发了报错。
TypeScript提示里已经给出了正确方向:改用映射对象类型。映射类型可以遍历联合类型的每个成员,生成对应的键值对,完全适配你想用枚举作为键的场景。
修正后的代码如下:
enum Option { ONE = 'one', TWO = 'two', THREE = 'three' } interface OptionRequirement { someBool: boolean; someString: string; } // 用映射类型替代索引签名 type OptionRequirements = { [K in Option]: OptionRequirement; };
这样写不仅符合TypeScript的类型规则,还能获得更严格的类型检查:它会强制要求OptionRequirements包含枚举Option的所有成员,不会出现遗漏或多余的键,比原来的索引签名更安全。
如果需要允许部分枚举成员可选,可以在映射时加上?:
type OptionRequirements = { [K in Option]?: OptionRequirement; };
内容的提问来源于stack exchange,提问作者john maccarthy
相关产品推荐
相关产品推荐

