如何从索引泛型类型获取类方法的参数与返回类型?
解决TypeScript类方法调用函数的类型约束问题
先看给定的Example类,里面既有方法也有非函数属性:
class Example { methodA(param1: string, param2: number) {} methodB(): string {} methodC(param1: boolean, param2: number): number {} prop1: string = ''; }
我们需要实现一个call函数:第一个参数是类的方法名称,后续参数对应该方法的入参,返回值类型和指定方法完全一致。示例调用如下:
call('methodA', 'a string', 123); // 无返回值方法调用 let value = call('methodC', true, 456); // 有返回值方法调用
直接用K extends keyof Example的话,因为Example[K]可能是prop1这种非函数类型,所以使用Parameters<Example[K]>和ReturnType<Example[K]>时会报错:Type 'Example[K]' does not satisfy the constraint '(...args: any) => any'。
核心解决方案:筛选出类中仅属于函数类型的键
我们可以通过条件类型先提取出Example类中所有值为函数的键,排除非函数属性。
先定义一个通用类型,用来提取任意类/对象中的方法键:
type MethodKeys<T> = { [K in keyof T]: T[K] extends Function ? K : never }[keyof T];
这个类型的逻辑是:遍历T的所有键,判断对应的值是否是函数类型——是就保留原键,否则标记为never;最后通过[keyof T]取出所有有效键,得到的就是仅包含方法名称的联合类型。
实现带正确类型推导的call函数
用MethodKeys<Example>作为K的约束,此时Example[K]必然是函数类型,就能安全使用Parameters和ReturnType了:
const exampleInstance = new Example(); function call<K extends MethodKeys<Example>>( methodName: K, ...args: Parameters<Example[K]> ): ReturnType<Example[K]> { return exampleInstance[methodName](...args); }
验证效果
现在调用call函数时,TypeScript会自动做参数校验和返回值类型推导:
- 调用
call('methodA', 'a string', 123):参数类型匹配,返回值为void - 调用
let value = call('methodC', true, 456):value的类型会被推导为number - 如果传入非方法名称(比如
'prop1'),或者参数类型不匹配,TypeScript会直接抛出类型错误
内容的提问来源于stack exchange,提问作者thebrowhoknocks
相关产品推荐
相关产品推荐

