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

