TypeScript中查找类型的返回类型处理及动态调用方法问题
TypeScript动态调用对象方法并正确推断返回类型问题
我定义了一个包含函数字段的Person类型,以及一个根据名称获取该类型函数的工具函数:
type Person = { getAge: () => number; getName: () => string; }; function getPersonFunction<K extends keyof Person>(person: Person, key: K): Person[K] { return person[key]; }
现在需要另一个工具函数来动态执行这些函数:
function callPersonFunction<K extends keyof Person>(person: Person, key: K) { return person[key](); }
但TypeScript会推断该函数的返回类型为any。尝试用ReturnType<Person[K]>指定返回类型时,还会出现错误。
核心问题:如何正确调用函数、动态推断其返回类型并保持泛型特性?
补充要求:
- 仅筛选方法(感谢@Alex)
- 支持带输入参数的方法
解决方案
要解决这个问题,我们需要先通过类型工具筛选出对象中仅包含方法的键,再基于这些键约束泛型参数,同时处理方法的输入参数和返回类型推断:
定义方法键筛选类型
先创建一个工具类型MethodsOf<T>,用来提取对象T中所有值为函数类型的键:type MethodsOf<T> = { [K in keyof T]: T[K] extends (...args: any[]) => any ? K : never; }[keyof T];实现支持参数和类型推断的调用函数
基于MethodsOf<T>约束泛型参数K,同时用Parameters<T[K]>获取方法的参数类型,ReturnType<T[K]>获取返回类型:// 扩展Person类型,增加带参数的方法测试 type Person = { getAge: () => number; getName: () => string; setName: (newName: string) => boolean; // 带参数的方法 }; function callPersonFunction<K extends MethodsOf<Person>>( person: Person, key: K, ...args: Parameters<Person[K]> ): ReturnType<Person[K]> { return person[key](...args); }验证类型推断效果
调用时TypeScript会自动推断参数和返回类型:const person: Person = { getAge: () => 25, getName: () => "Alice", setName: (name) => { console.log(name); return true; } }; const age = callPersonFunction(person, "getAge"); // age类型为number const name = callPersonFunction(person, "getName"); // name类型为string const setResult = callPersonFunction(person, "setName", "Bob"); // setResult类型为boolean
原问题原因说明
- 之前的泛型
K extends keyof Person没有限制仅为方法键,若Person存在非函数属性会导致调用错误,TypeScript因此无法准确推断返回类型,只能返回any。 - 直接使用
ReturnType<Person[K]>时,由于K可能对应非函数类型,TypeScript会抛出类型不兼容的错误,而通过MethodsOf<T>约束后,Person[K]必然是函数类型,ReturnType和Parameters就能正常工作。
内容的提问来源于stack exchange,提问作者yelliver
相关产品推荐
相关产品推荐

