TypeScript升级后,Promise返回类型错误

时间:2017-07-11 19:58:23

标签: typescript es6-promise

使用typescript v2.3.4,以下代码运行良好:

    getStuff() : Promise<IStuff>{

        return this.http.get(url, options)
            .toPromise()
            .then( (res) => {
                let stuff: IStuff;
                if (res.json().data){
                    stuff = res.json().data;
                }
                return stuff;
            })
            .catch( (reason) => {
                this.handleError(reason);
            });
    }

...其中handleError是这样的:

handleError = (error:any) => {
    this.debug(error);
    throw error;
}; 

现在,使用typescript v2.4.1我收到错误:'Type 'Promise<void | IStuff>' is not assignable to type 'Promise<IStuff>'. Type 'void | IStuff' is not assignable to type 'IStuff'. Type 'void' is not assignable to type 'IStuff'.'

我明白为什么会这样。

...但是这样做了,对我来说没有意义,当其他代码没有时,它会起作用:

getStuff() : Promise<IStuff>{

    return this.http.get(url, options)
        .toPromise()
        .then( (res) => {
            let stuff: IStuff;
            if (res.json().data){
                stuff = res.json().data;
            }
            return stuff;
        })
        .catch( (reason) => {
                if( reason.status) {
                    return Promise.reject(reason);
                } else {
                    this.handleError(reason);
                }
        });
}

...在else的情况下,它正在完成上面产生错误的代码正在做的事情,但是没有错误。

我可以通过将handleError更改为:

来解决问题
handleError = (error:any):Promise<any> => {
    this.debug(error);
    Promise.reject(error);
};

...但我很好奇特定的更改是什么导致它成为一个错误,以及为什么添加if/else块在其具有与其相同的else路径时正常工作原始代码?

1 个答案:

答案 0 :(得分:2)

使用TypeScript 2.4版本,TypeScript对泛型和Promise回调变得更加严格,这将导致升级问题,特别是那些使用Promises的问题。我在几个应用程序中都注意到了这一点。您可以在2.4。的发行说明中read about it