2017-07-11 59 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