打字稿通用承诺返回类型

Posted

技术标签:

【中文标题】打字稿通用承诺返回类型【英文标题】:Typescript Generic Promise Return Type 【发布时间】:2019-04-25 23:47:40 【问题描述】:

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

所以如果我用布尔值调用它会返回一个已完成的 Promise,如果我用一个字符串参数调用它会返回一个已完成的 Promise 等等..

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

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

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

任何建议将不胜感激

【问题讨论】:

【参考方案1】:

您的实现似乎很好, 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>

【讨论】:

非常感谢,我喜欢使用重载的想法,是否可以使用带箭头符号的重载? @Plastic 是的,你可以(编辑答案),但语法不是很好......如果你不需要捕获this 行为,我会坚持使用常规函数进行重载 @TitianCernicova-Dragomir 嗨,我想知道是否可以在函数中使用泛型类型?像public promiseOK&lt;T&gt;(endpoint: string, returnType: T): Promise&lt;T&gt; const promise: Promise&lt;returnType&gt;... returnType 在这里是未知的。 cannot find name returnType。我正在尝试制作一个通用的包装函数。如何让 Promise 将其作为参数? @Joel type 参数代表returnType 的类型,你应该使用它:Promise&lt;T&gt; 在函数体中可以正常工作。 @TitianCernicova-Dragomir 我最近问了一个问题,我在哪里解释我所追求的更多。你介意看看吗?谢谢。【参考方案2】:

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();

【讨论】:

【参考方案3】:

应该是这样的

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

【讨论】:

感谢您的回答,问题是如果我尝试调用 PromiseOK(),编译器会说该函数需要一个参数......它可以通过将 val 作为可选参数来解决吗? ? @Plastic 是的,可以这样解决。但那这个功能就没有意义了?

以上是关于打字稿通用承诺返回类型的主要内容,如果未能解决你的问题,请参考以下文章

打字稿接口和承诺返回一个对象/构造函数?

具有通用返回类型的打字稿函数

打字稿:强制默认通用类型为“any”而不是“”

修改返回数据,然后在打字稿/离子中返回承诺

打字稿 - 在函数返回之前等待承诺解决

如何监视调用另一个返回承诺的服务的服务函数 - 打字稿