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

如何让TypeScript的tryCatchWrap保留原函数的调用签名?

解决TypeScript中try/catch包装函数丢失原函数类型签名的问题

你当前的tryCatchWrap函数因为返回固定的AsyncCb类型(参数为...args: any[]),导致TypeScript无法保留原函数的类型签名。要解决这个问题,需要用泛型来捕获并复用原函数的参数和返回类型。

修改后的代码

// 用泛型捕获原异步函数的完整类型
export default function tryCatchWrap<T extends (...args: any[]) => Promise<any>>(cb: T): T {
  return async (...args: Parameters<T>) => {
    try {
      // 保留原函数的返回值传递
      return await cb(...args);
    } catch (err) {
      console.log((err as Error).message);
      // 可选:如果需要让上层处理错误,取消下面的注释
      // throw err;
    }
  } as T;
}

关键改动说明

  • 泛型T约束为任意异步函数类型,确保传入的回调cb是返回Promise的函数
  • 使用Parameters<T>工具类型获取原函数的参数类型,保证调用时的参数类型安全
  • 将返回的异步函数断言为T,让TypeScript识别其类型与原函数完全一致
  • 保留原函数的返回值传递(若不需要可移除return,但建议保留以保持行为一致性)

使用效果

const testFn = tryCatchWrap(async function testFn(testStr: string) {
  // ... 业务代码
});

// 悬浮到testFn时,会显示正确的调用签名:(testStr: string) => Promise<void>
testFn("test"); // 类型检查生效,不传参数或传入非string类型会触发TypeScript报错

内容的提问来源于stack exchange,提问作者Islam Y-

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:12:48