如何让TypeScript自动推导嵌套函数返回类型的泛型类型?
解决TypeScript tryGate工具函数自动泛型推导问题
问题根源
你的tryGate工具当前泛型参数没有和exec方法的异步函数返回值、onPass/onThrow的处理函数返回值建立关联,导致TypeScript无法自动推导最终返回类型,只能默认到unknown。
修正后的实现示例
import { readdir } from 'fs/promises'; class TryGate<T = unknown, E = unknown> { private passHandler?: (res: T) => T; private throwHandler?: (err: unknown) => E; onPass(handler: (res: T) => T): this { this.passHandler = handler; return this; } onThrow(handler: (err: unknown) => E): this { this.throwHandler = handler; return this; } async exec(fn: () => Promise<T>): Promise<T | E> { try { const res = await fn(); return this.passHandler?.(res) ?? res; } catch (err) { return this.throwHandler?.(err) ?? (err as E); } } } // 让工具函数支持泛型初始化推导 function tryGate<T = unknown, E = unknown>() { return new TryGate<T, E>(); } // 调用时无需显式声明泛型,TS自动推导 const test = tryGate() .onPass(res => res) // res自动推导为string[] .onThrow(err => ['读取失败']) // 返回值自动推导为string[],E类型确定 .exec(() => readdir('./test', 'utf8')); // test类型为Promise<string[]>
核心调整点
- 将
TryGate类的泛型参数T(成功值类型)与exec方法的异步函数返回值绑定,当你传入返回string[]的readdir时,TS会自动推导T为string[]。 onPass方法的处理函数参数类型直接关联到T,确保类型一致;onThrow的返回值类型关联到泛型E,TS会根据你传入的处理函数返回值自动推导E的类型。- 工具函数
tryGate支持泛型默认值,无需提前声明类型,完全依赖后续链式调用的参数推导。
这样调整后,无需显式指定<string[], string[]>泛型参数,TypeScript就能自动推导出test的类型为Promise<string[]>。
内容的提问来源于stack exchange,提问作者CC-white
相关产品推荐
相关产品推荐

