Typescript:Promise 的子类/扩展:不引用 Promise 兼容的构造函数值
Posted
技术标签:
【中文标题】Typescript:Promise 的子类/扩展:不引用 Promise 兼容的构造函数值【英文标题】:Typescript: subclass/extend of Promise: does not refer to a Promise-compatible constructor value 【发布时间】:2017-09-05 17:41:16 【问题描述】:我正在尝试取消我在 Typescript 中的 async
方法调用。
为此,我创建了一个新的 Promise 类型,它继承自 Promise
:
class CancelablePromise<T> extends Promise<T>
private cancelMethod: () => void;
constructor(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void, cancelMethod: () => void)
super(executor);
this.cancelMethod = cancelMethod;
//cancel the operation
public cancel()
if (this.cancelMethod)
this.cancelMethod();
但是当我尝试使用它时:
async postFileAjax<T>(file: File): CancelablePromise<T> ...
我得到错误:
Error Build:Type 'typeof CancelablePromise' 在 ES5/ES3 中不是有效的异步函数返回类型,因为它不引用与 Promise 兼容的构造函数值。
如果我使用类型声明并返回CancelablePromise
,则像这样编译:
async postFileAjax<T>(file: File): Promise<T>
...
return CancelablePromise(...);
我做错了什么?我看到在 ES6 中你可以继承 Promise
(参见 *** question),所以我希望它也在 TypeScript 中。
使用 Typescript 2.1 并以 es5 为目标
【问题讨论】:
你不能扩展内置类型,除非你以es6
(或以上)为目标
如果您对此有参考,那么这就是公认的答案;)
试试这个:Extending from Error doesn't work when emitting ES5
我拆分了编译和运行时错误。编译错误已解决,现在运行时错误:***.com/questions/43420175/…
你应该做的是实现PromiseLike
而不是扩展Promise
【参考方案1】:
起初我并没有完全清楚错误消息,但构造函数的签名应该与Promise
的构造函数完全相同。
我已经从构造函数中删除了cancelMethod
,稍后会设置它。这有效:
class CancelablePromise<T> extends Promise<T>
public cancelMethod: () => void;
constructor(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void)
super(executor);
//cancel the operation
public cancel()
if (this.cancelMethod)
this.cancelMethod();
然后调用:
async postFileAjax<T>(file: File): CancelablePromise <T>
var promiseFunc = (resolve) => resolve() ;
var promise = new CancelablePromise<T>(promiseFunc);
promise.cancelMethod = () => console.log("cancel!") ;
return promise;
【讨论】:
以上是关于Typescript:Promise 的子类/扩展:不引用 Promise 兼容的构造函数值的主要内容,如果未能解决你的问题,请参考以下文章
typescript async函数必需返回promise么