TypeScript基于方法类型创建映射对象类型的报错解决问询
你遇到的问题其实是TypeScript中索引签名和映射类型的语法差异导致的,我来一步步帮你理清并给出正确实现:
为什么之前的代码报错?
第一个错误:
An index signature parameter type cannot be a union type
普通的对象索引签名(比如[key: string]: any)要求键的类型是单一的基础类型(string/number/symbol),而keyof ListOfMethods返回的是联合类型"one" | "two",不符合索引签名的要求,所以TypeScript提示你改用映射类型。第二个错误:
A computed property name must be of type 'string', 'number', 'symbol', or 'any'
你尝试用[key in keyof ListOfMethods]: any是映射类型的正确语法,但这个语法只能用在type类型别名中,不能直接写在interface里,接口不支持这种动态键的定义方式。
正确实现方式
方案1:直接用映射类型定义Obj(推荐)
用type关键字创建映射类型,这是TypeScript专门用来基于已有类型的键生成新类型的特性:
type ListOfMethods = { one(): void; two(): void }; // 映射类型:遍历ListOfMethods的所有键,值类型设为any type Obj = { [key in keyof ListOfMethods]: any; };
此时Obj会被TypeScript解析为:
{ one: any; two: any; }
方案2:如果需要用interface定义
如果业务场景必须使用interface,可以先通过type定义映射类型的基础,再让接口继承它:
type ListOfMethods = { one(): void; two(): void }; type ObjBase = { [key in keyof ListOfMethods]: any; }; interface Obj extends ObjBase {}
方案3:同时保留指定键和任意字符串键
如果还需要Obj支持其他任意字符串键(和你最初的[key: string]: any需求兼容),可以用交叉类型结合两者:
type ListOfMethods = { one(): void; two(): void }; type Obj = { [key in keyof ListOfMethods]: any; } & { [key: string]: any; };
这样Obj既包含one/two这两个指定键,也允许添加其他任意字符串键,所有值的类型都是any。
内容的提问来源于stack exchange,提问作者Get Off My Lawn

