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

TypeScript类型映射:如何包装函数返回值并保留参数与泛型?

解决TypeScript映射类型保留函数参数与泛型的问题

没问题,我来帮你搞定这个TypeScript映射类型的需求!你需要的Asyncd类型要能完美保留原函数的参数类型和泛型,同时把返回值包装成Promise,下面是修正后的实现:

完整实现代码

type Asyncd<T> = {
  [K in keyof T]: 
    T[K] extends <G>(...args: infer P) => infer R
      ? <G>(...args: P) => Promise<Awaited<R>>
      : T[K] extends (...args: infer P) => infer R
        ? (...args: P) => Promise<Awaited<R>>
        : T[K];
};

测试验证

用你提供的Store接口测试:

interface Store { 
  test1(): void; 
  test2(a: string, b: number): RegExp; 
  test3<T>(a: string, b: number): Promise<T>; 
}

type AsyncStore = Asyncd<Store>;

生成的AsyncStore类型完全符合你的期望:

{
  test1(): Promise<void>;
  test2(a: string, b: number): Promise<RegExp>;
  test3<T>(a: string, b: number): Promise<T>;
}

为什么这个实现能解决问题?

咱们拆解一下关键部分:

  • 保留参数类型:通过infer P捕获原函数的参数列表类型,彻底避免了用any[]导致的参数丢失问题。
  • 保留泛型参数:专门处理了带泛型的函数,用infer G捕获原函数的泛型参数,在重构函数时直接复用这个泛型,确保test3<T>的泛型能被完整保留。
  • 正确包装返回值:使用Awaited<R>处理原返回值可能已经是Promise的情况(比如test3的返回值是Promise<T>),避免出现嵌套的Promise<Promise<T>>,最终得到干净的Promise<T>。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:37:21