8

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

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

到目前为止我尝试了什么:

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

我不知道这是否是正确的方法,无论如何,如果我尝试获得 Promise< void > 它会中断

任何建议将不胜感激

4

3 回答 3

9

您的实现似乎很好, 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>
于 2018-11-23T11:42:34.567 回答
1

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();
于 2021-04-29T16:06:43.683 回答
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.

于 2018-11-23T11:07:53.607 回答