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

TypeScript如何根据输入transformer函数动态修改方法返回类型

问题解决方案

你原有代码的问题主要集中在3处:

  1. TransformerFn的泛型定义位置错误,泛型需要在调用时绑定,而非声明时全局固定
  2. 条件返回类型OriginalOrTransformedPerson没有匹配实际返回的数组结构,也没有关联transformer的返回类型
  3. 类中getPeople的实现没有对应接口的泛型定义,导致类型推断失效

修正后完整代码

// 基础Person接口
interface Person {
  name: string;
  age: number
};

// 泛型移到外层,调用时确定返回类型
type TransformerFn<T> = (person: Person) => T;

// 配置项接口,泛型关联transformer返回类型
interface MapperOpts<T = never> {
  paramA?: number
  transformer?: TransformerFn<T>
}

// 条件返回类型,匹配数组返回结果
type OriginalOrTransformedPerson<T> = T extends TransformerFn<infer R> ? R[] : Person[];

// 类接口,拆分泛型分别处理配置项和transformer返回值
interface PeopleGetter {
  getPeople<T = never>(people: Person[], opts?: MapperOpts<T>): OriginalOrTransformedPerson<T>
}

class Test implements PeopleGetter {
  getPeople<T = never>(people: Person[], opts: MapperOpts<T> = {}) {
    if (opts.transformer) {
      return people.map(opts.transformer);
    } else {
      return people;
    }
  }
}

const people: Person[] = [{ name: 'john', age: 20 }];
const test = new Test();
// 类型推断为Person[]
const original = test.getPeople(people);
// 类型推断为string[]
const transformedResult = test.getPeople(people, { transformer: (person) => person.name });

核心修正说明

  • 把TransformerFn的泛型移到类型定义外层,让调用时传入的回调返回类型可以被正确捕获
  • 配置项MapperOpts改为带泛型的结构,关联transformer的返回类型
  • 条件返回类型调整为匹配数组结构,用infer自动提取transformer的返回值类型
  • 类实现中的getPeople对齐接口的泛型定义,同时给opts设置默认空对象,支持不传配置的调用场景

内容的提问来源于stack exchange,提问作者mitsos1os

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:57:05