2017-07-11 60 views
1

使用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当它有一个与原始代码相同的其他路径时阻塞工作正常?

+2

如果在'then' /'catch'块中没有返回语句,它看起来像是返回一个'void'类型。只要你添加一个,它就会尝试推断该行的返回类型,即使并不是所有的代码路径都返回一个值,也不会隐式地添加“void”。至于为什么这是我不知道,也许是设计或可能是因为跟踪所有可能的代码路径在编译器中很困难,所以错误无法发出或者它可能是一个错误。 – Igor

+0

这听起来很合理。我还认为我的代码最初工作的原因是一个错误,目前的行为只是修正了这个错误的结果。 – WillyC

回答

2

随着TypeScript 2.4的发布,TypeScript已经变得更加严格,泛型和Promise回调会导致升级问题,尤其是那些使用Promises的问题。我在几个应用中注意到了这一点。您可以在2.4的发行说明中使用read about it