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

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)
  • 支持带输入参数的方法

解决方案

要解决这个问题,我们需要先通过类型工具筛选出对象中仅包含方法的键,再基于这些键约束泛型参数,同时处理方法的输入参数和返回类型推断:

  1. 定义方法键筛选类型
    先创建一个工具类型MethodsOf<T>,用来提取对象T中所有值为函数类型的键:

    type MethodsOf<T> = {
      [K in keyof T]: T[K] extends (...args: any[]) => any ? K : never;
    }[keyof T];
    
  2. 实现支持参数和类型推断的调用函数
    基于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);
    }
    
  3. 验证类型推断效果
    调用时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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:13:17