typescript - 如何实现一个将任何函数类型的返回类型转换为 Promise 的工具类型?
我想编写一个实用类型,能够将任何函数类型(包括泛型函数)转换为返回 Promise 的类型。
我的想法是这样的:
type Promisify<T extends (...args: any) => any> = T extends (...args: infer A) => infer R
? (...args: A) => Promise<R>
: never;
不幸的是,这对于泛型不起作用:
type Bar<T> = () => T extends string ? number: string
// ERROR: Generic type 'Bar' requires 1 type argument(s).
type PromisifyBar = Promisify<Bar>
在我实际的情况下,我想转换在接口(第三方库的接口)中声明的函数类型,并仅更改返回类型:
interface Foo {
baz<T extends { a?: string, b?: string}>(arg: T): T extends {a: string} ? string : number;
}
type Baz = Foo["baz"]
type PromisifiedBaz = Promisify<Foo["baz"]>
// Only type is relevant so skip implementaion
const baz: Baz = undefined as any;
const promisifiedBaz: PromisifiedBaz = undefined as any;
// CORRECT
const shouldBeNumber = baz({b: "b"});
// CORRECT
const shouldBeString = baz({a: "a", b: "b"});
// CORRECT
const shouldBePromiseNumber = promisifiedBaz({b: "b"});
// WRONG: it's of type Promise<number>
const shouldBePromiseString = promisifiedBaz({a: "a", b: "b"});
操场
正如你所看到的,除了最后的 shouldBePromiseString 外,它都能正常工作。我猜可能是类型推断有问题(参见 Promisify 中的 infer A),这就是为什么返回类型被错误推断的原因。
我如何才能创建这样的工具类型?这甚至可能吗?有没有替代方案?有没有比我建议的 Promisify 更好的实现?