基本上,我正在尝试实现一个函数,该函数始终返回作为参数传递给该函数的相同“类型”的已实现诺言
因此,如果我使用布尔值进行调用,它将返回一个已实现的Promise,如果我使用一个字符串参数进行调用,它将返回一个已实现的Promise,依此类推。
到目前为止我尝试过的:
const PromiseOK = <T>(val: T): Promise<T> => {
return Promise.resolve(val);
};
我不知道这是否是正确的方法,并且在任何情况下如果我尝试获得Promise都会破坏
任何建议将不胜感激
答案 0 :(得分:3)
您的实现看起来还不错,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>
答案 1 :(得分:1)
OP 正在寻找匹配参数的类型和返回值。
但是,如果您正在寻找返回类型由调用者动态设置的真正通用的承诺,请使用它。
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();
答案 2 :(得分:0)
应该看起来像这样
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
。