使用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
當它有一個與原始代碼相同的其他路徑時阻塞工作正常?
如果在'then' /'catch'塊中沒有返回語句,它看起來像是返回一個'void'類型。只要你添加一個,它就會嘗試推斷該行的返回類型,即使並不是所有的代碼路徑都返回一個值,也不會隱式地添加「void」。至於爲什麼這是我不知道,也許是設計或可能是因爲跟蹤所有可能的代碼路徑在編譯器中很困難,所以錯誤無法發出或者它可能是一個錯誤。 – Igor
這聽起來很合理。我還認爲我的代碼最初工作的原因是一個錯誤,目前的行爲只是修正了這個錯誤的結果。 – WillyC