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

如何在TypeScript中创建带额外选项且支持回调参数的包装函数?

TypeScript 带额外选项的参数化包装函数实现

需求说明

我需要在TypeScript中写一个包装函数,要满足这些要求:

  • 执行目标回调函数前,先跑一些前置初始化逻辑
  • 回调执行完(不管成功失败),自动执行清理操作
  • 包装函数本身能接收额外的配置选项
  • 目标回调函数可以接收任意参数,且类型保持安全

之前写的初始代码没法给回调传参,想知道怎么同时支持...args参数传递和自定义options。

解决方案

通过TypeScript泛型捕获回调的参数和返回值类型,让包装函数返回一个新函数来接收回调的参数,同时把options作为包装函数的第二个参数传入,这样就不会和回调参数冲突,还能保持类型安全。

完整实现代码

export function wrap<Args extends any[], T>(
  callback: (...args: Args) => T | Promise<T>,
  options?: { foo?: string }
): (...args: Args) => Promise<T> {
  // 返回一个新函数,专门用来接收回调的参数
  return async (...args: Args) => {
    let ret: T;

    // 前置逻辑:根据配置选项执行初始化
    if (options?.foo) {
      // 这里替换成你的实际前置操作,比如启动进程、初始化资源
      console.log(`启动前置逻辑,使用选项 foo=${options.foo}`);
    }

    try {
      // 执行回调并传递所有参数
      ret = await callback(...args);
    } catch (e) {
      // 可选:统一处理错误,或者直接抛出让调用方处理
      throw e;
    } finally {
      // 清理逻辑:无论回调成功失败都会执行
      console.log("执行清理操作,释放资源");
      // 这里替换成你的实际清理操作,比如关闭进程、释放连接
    }

    return ret;
  };
}

使用示例

// 示例1:无参数的异步回调
const wrappedFunc1 = wrap(async () => {
  await new Promise(resolve => setTimeout(resolve, 100));
  return "无参数回调执行完成";
}, { foo: "demo1" });

wrappedFunc1().then(result => console.log(result));

// 示例2:带多个参数的同步回调
const wrappedFunc2 = wrap((num: number, str: string) => {
  return `参数:数字${num},字符串${str}`;
}, { foo: "demo2" });

wrappedFunc2(123, "hello").then(result => console.log(result));

关键点说明

  • 泛型类型安全:Args extends any[]捕获回调的参数类型,T捕获返回值类型,确保调用时参数和返回值的类型完全匹配原函数
  • 参数分离:包装函数接收callback和options,返回的新函数只接收回调的参数,避免参数混淆
  • 异步兼容:用await处理回调的同步/异步返回值,统一包装成Promise返回
  • 可靠清理:清理逻辑放在finally块,确保无论回调成功还是抛出错误,都会执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:40:58