如何使用TypeScript泛型约束为返回Promise的函数添加日志
为返回Promise的函数添加日志并实现TypeScript类型约束
先回顾你给出的JavaScript实现——它能很好地给返回Promise的函数添加上日志功能,但在TypeScript里我们需要通过类型约束来保证类型安全,让这个工具函数既能复用,又不会出现类型不匹配的问题。
核心思路
我们需要用泛型来捕获原函数的参数类型和Promise的返回值类型,确保addLogging返回的函数和原函数的签名完全一致:
- 泛型
Args约束原函数的参数列表(支持任意数量、任意类型的参数) - 泛型
R约束原函数返回的Promise的内部值类型
TypeScript基础实现代码
const addLogging = <Args extends any[], R>( f: (...args: Args) => Promise<R> ) => (...args: Args): Promise<R> => { return f(...args).then(result => { console.log('result:', result); return result; // 保持原函数的返回值,不改变业务逻辑 }); }; // 测试示例 const test = addLogging((value: string) => Promise.resolve(value)); test('foo'); // 输出 "result: foo",且类型检查完全通过
补充:包含错误日志的完整版本
如果原函数可能会reject,我们也可以给错误情况添加日志,同时注意不要吞掉错误(要继续抛出,保证原函数的错误行为不变):
const addLoggingWithError = <Args extends any[], R>( f: (...args: Args) => Promise<R> ) => (...args: Args): Promise<R> => { return f(...args) .then(result => { console.log('result:', result); return result; }) .catch(error => { console.error('error:', error); throw error; // 必须抛出错误,否则原函数的reject会被转换成resolve(undefined) }); };
类型约束的实际作用
这样实现后,TypeScript会自动做以下检查:
- 只有返回Promise的函数才能传入
addLogging - 返回的函数参数类型必须和原函数完全匹配
- 调用返回的函数后,得到的Promise类型和原函数一致
内容的提问来源于stack exchange,提问作者Tom Esterez
相关产品推荐
相关产品推荐

