如何实现将任意函数返回类型转为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
相关产品推荐
相关产品推荐

