You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从索引泛型类型获取类方法的参数与返回类型?

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:22:16