Typescript泛型Promise返回类型



基本上,我试图实现一个函数,该函数总是返回与我作为参数传递给函数的"类型"相同的已实现承诺

因此,如果我用布尔值调用,它会返回一个已完成的Promise,如果我使用字符串参数调用,它将返回一个未完成的Promce,依此类推。

到目前为止我尝试过的:

const PromiseOK = <T>(val: T): Promise<T> => {
return Promise.resolve(val);
};

我不知道这是否是正确的方式,在任何情况下,如果我试图得到一个承诺<void>

任何建议都将受到的赞赏

您的实现似乎很好,void的问题是参数仍然是预期的。你可以用undefined来称呼它

const PromiseOK = <T>(val: T): Promise<T> => {
return Promise.resolve(val);
};
PromiseOK<void>(undefined)

一个更好的选择可能是使用重载来获得void的特殊行为:

function PromiseOK(): Promise<void>
function PromiseOK<T>(val: T): Promise<T>
function PromiseOK<T>(val?: T): Promise<T> {
return Promise.resolve(val);
};
PromiseOK() // Promise<void>
PromiseOK(1) //Promise<number>

可以使用箭头函数重载,但语法并不完全正确:

const PromiseOK: {
(): Promise<void>
<T>(val: T): Promise<T>
} = <T>(val?: T): Promise<T> => Promise.resolve(val);
PromiseOK() // Promise<void>
PromiseOK(1) //Promise<number>

OP希望匹配参数的类型和返回值。

但是,如果您正在寻找一个真正通用的promise,它的返回类型是由调用者动态设置的,请使用它。

const foo = <T>(bar: Bar): Promise<T> => {
return new Promise<T>((resolve, reject) => {
// resolve to anything you want that has type T
// e.g. API response: T
});
};
// Usage
foo<YourType>(someValueForBar).then().catch();

它应该看起来像这个

function PromiseOK<T>(val: T): Promise<T> {
return Promise.resolve(val);
};

如果你想保留胖箭头符号,那么

const PromiseOK = <T extends any>(val: T): Promise<T> => {
return Promise.resolve(val);
};

符号T extends any也支持void

最新更新