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

如何让TypeScript的errorBound函数正确推导泛型函数的返回类型

解决方案

你的代码问题在于泛型约束过于宽泛,Function类型无法让TypeScript正确推导函数返回值类型。以下是修正方案:

方案一:在函数上直接定义泛型

export const errorBound = async <Fn extends () => unknown>(fn: Fn): Promise<ReturnType<Fn> | Error> => {
  try {
    return await fn();
  } catch (e) {
    console.error("errorBound!!");
    console.error({ e });
    return e as Error;
  }
};

调用const foo = errorBound(() => 1)时,foo的类型会自动推导为Promise<number | Error>。这里将泛型Fn约束为无参数函数,确保ReturnType<Fn>能准确获取返回类型;同时对catch中的e添加as Error断言,因为catch捕获的错误默认类型是unknown,需要明确类型以匹配返回值要求。

方案二:修正类型别名的泛型定义

若需保留ErrorBound类型别名,需明确泛型的函数约束:

type ErrorBound = <Fn extends () => unknown>(fn: Fn) => Promise<ReturnType<Fn> | Error>;

export const errorBound: ErrorBound = async (fn) => {
  try {
    return await fn();
  } catch (e) {
    console.error("errorBound!!");
    console.error({ e });
    return e as Error;
  }
};

核心要点

  • 替换Fn extends Function为Fn extends () => unknown,缩小泛型范围,让TypeScript能正确解析函数返回类型。
  • catch块中必须对错误对象做类型断言,否则会因unknown类型与返回值的Error不兼容而报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:09:32