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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:28:50