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

如何让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[]>

核心调整点

  1. 将TryGate类的泛型参数T(成功值类型)与exec方法的异步函数返回值绑定,当你传入返回string[]的readdir时,TS会自动推导T为string[]。
  2. onPass方法的处理函数参数类型直接关联到T,确保类型一致;onThrow的返回值类型关联到泛型E,TS会根据你传入的处理函数返回值自动推导E的类型。
  3. 工具函数tryGate支持泛型默认值,无需提前声明类型,完全依赖后续链式调用的参数推导。

这样调整后,无需显式指定<string[], string[]>泛型参数,TypeScript就能自动推导出test的类型为Promise<string[]>。

内容的提问来源于stack exchange,提问作者CC-white

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:20:14