TypeScript如何根据输入transformer函数动态修改方法返回类型
问题解决方案
你原有代码的问题主要集中在3处:
TransformerFn的泛型定义位置错误,泛型需要在调用时绑定,而非声明时全局固定- 条件返回类型
OriginalOrTransformedPerson没有匹配实际返回的数组结构,也没有关联transformer的返回类型 - 类中
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
相关产品推荐
相关产品推荐

