打字稿一般承诺退回类型

时间:2018-11-23 11:00:20

标签: typescript generics promise typescript-generics

基本上,我正在尝试实现一个函数,该函数始终返回作为参数传递给该函数的相同“类型”的已实现诺言

因此,如果我使用布尔值进行调用,它将返回一个已实现的Promise,如果我使用一个字符串参数进行调用,它将返回一个已实现的Promise,依此类推。

到目前为止我尝试过的:

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

我不知道这是否是正确的方法,并且在任何情况下如果我尝试获得Promise都会破坏

任何建议将不胜感激

3 个答案:

答案 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