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

TypeScript中能否将函数返回类型设置为其回调函数的返回类型?

需求实现方案

该需求可以通过给工具函数添加泛型约束实现,具体修改如下:

核心优化点

  • 新增泛型参数承接传入函数的返回值类型,替代原来的any类型声明
  • 显式定义工具函数返回值为固定结构的联合元组,避免TS自动拓宽类型为普通数组
  • 兼容同步、异步两种入参函数场景
  • 可选自定义错误类型的泛型参数,满足不同场景下的错误类型标注需求

修改后的代码

基础版(错误类型默认推导为unknown):

export const tryAsyncAwait = async <T>(fn: () => Promise<T> | T): Promise<[T, null] | [null, unknown]> => {
  try {
    const data = await fn();
    return [data, null] as const;
  } catch (error) {
    return [null, error] as const;
  }
};

进阶版(支持自定义错误类型):

export const tryAsyncAwait = async <T, E = unknown>(fn: () => Promise<T> | T): Promise<[T, null] | [null, E]> => {
  try {
    const data = await fn();
    return [data, null] as const;
  } catch (error) {
    return [null, error as E] as const;
  }
};

实际使用效果

传入你定义的getNum函数调用时:

const getNum = (x: number) => x * 2;
// 自动推断res类型为 [number, null] | [null, unknown]
const res = await tryAsyncAwait(() => getNum(2));
// 类型收窄后可直接推导为[number, null]
if (res[1] === null) {
  console.log(res[0]) // res[0] 类型自动识别为number
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:54:05