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么

如何等待 JavaScript/TypeScript 中的 Promise 列表?

带有 Promise 的 typescript 响应类型

Promise.reject的TypeScript错误

TypeScript Promise 语法

使用 Promise 的 TypeScript 异步类型保护