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

如何实现将任意函数返回类型转为Promise的TypeScript工具类型?

你遇到的泛型函数返回值推导错误的核心原因是:原有基于条件类型infer的实现会直接抹除原函数的泛型定义,推导返回值R时会基于泛型参数的约束提前做静态计算,不会保留返回值和函数泛型参数之间的依赖关系,所以依赖入参类型的条件返回逻辑就失效了。

可行的实现方案(适配TS 4.7及以上版本)

不需要提前推导参数和返回值,将泛型推导逻辑延迟到函数调用阶段即可保留原函数的依赖关系:

type Promisify<T extends (...args: any[]) => any> = 
  <P extends Parameters<T>>(...args: P) => Promise<ReturnType<Extract<T, (...args: P) => any>>>;

效果验证

替换你的Promisify实现后,测试用例可正常推导:

// 其余代码保持不变
const shouldBePromiseNumber = promisifiedBaz({b: "b"}); // 类型为 Promise<number>,符合预期
const shouldBePromiseString = promisifiedBaz({a: "a", b: "b"}); // 类型为 Promise<string>,符合预期

补充说明

你提到的Promisify<Bar>报错是TS的基础泛型规则导致的,和Promisify实现无关:Bar<T>本身是泛型类型构造器,不是具体的函数类型,必须传入类型参数后才能作为Promisify的入参,比如Promisify<Bar<string>>即可正常使用。

如果需要批量转换整个接口的所有方法为Promise返回,可以搭配映射类型使用:

type PromisifyInterface<T> = {
  [K in keyof T]: T[K] extends (...args: any[]) => any ? Promisify<T[K]> : T[K]
}

// 示例:转换整个Foo接口
type PromisifiedFoo = PromisifyInterface<Foo>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:54:02