ES6类中用string索引this触发TS7053错误如何定义入参类型
解决方案
你需要将execute方法的name参数类型限定为Person类实例上的合法方法名,具体修改如下:
方式1:简单适配(已知类全为方法的场景)
直接通过keyof Person拿到实例所有键的联合类型,再排除execute本身避免循环调用问题:
class Person { run(){ console.log("running"); } walk(){ console.log("walking"); } talk(){ console.log("talking"); } // 限定name只能是Person实例除了execute之外的合法键 execute(name: Exclude<keyof Person, 'execute'>){ this[name]() } } const me = new Person(); me.execute('run'); // 正常类型提示+校验 me.execute('walk'); // 正常 me.execute('talk'); // 正常 me.execute('test'); // 传不存在的方法名TS会直接校验报错
方式2:通用适配(类包含非函数属性的场景)
如果类上可能存在非函数类型的属性,可以先写通用工具类提取所有值为函数的键,再排除execute:
// 通用工具类型:提取目标类型中所有值为函数的键 type FunctionKeys<T> = { [K in keyof T]: T[K] extends (...args: any[]) => any ? K : never }[keyof T] class Person { // 非函数属性示例 age = 18 run(){ console.log("running"); } walk(){ console.log("walking"); } talk(){ console.log("talking"); } // 自动过滤出除了execute之外的所有函数类型键 execute(name: Exclude<FunctionKeys<Person>, 'execute'>){ this[name]() } }
错误原因说明
原代码中name参数是string类型,TypeScript无法确认任意字符串是否是Person实例上存在的合法索引,因此抛出TS7053错误。通过keyof关键字获取类实例的键联合类型后,TypeScript可以在编译期就校验传入的方法名是否合法,同时也能正确推导this[name]的类型。
内容的提问来源于stack exchange,提问作者Garuuk
相关产品推荐
相关产品推荐

