如何让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-
相关产品推荐
相关产品推荐

