打字稿通用承诺返回类型
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<T>(endpoint: string, returnType: T): Promise<T> const promise: Promise<returnType>...
returnType 在这里是未知的。 cannot find name returnType
。我正在尝试制作一个通用的包装函数。如何让 Promise 将其作为参数?
@Joel type 参数代表returnType
的类型,你应该使用它:Promise<T>
在函数体中可以正常工作。
@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 是的,可以这样解决。但那这个功能就没有意义了?以上是关于打字稿通用承诺返回类型的主要内容,如果未能解决你的问题,请参考以下文章