Feil med returtypen til Promise etter oppgradering av TypeScript
Ved å bruke typescript v2.3.4, fungerte følgende kode fint:
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);
});
}
...hvor handleError er slik:
handleError = (error:any) => {
this.debug(error);
throw error;
};
Nå, med typescript v2.4.1 får jeg feilen: 'Type 'Promise<void | IStuff>' er ikke tildelbar til typen 'Promise<IStuff>'. Type 'void | IStuff' er ikke tildelbar til typen 'IStuff'. Type 'void' er ikke tildelbar til typen 'IStuff'.'
Jeg kan se hvorfor det ville være tilfelle.
...men dette FUNGERER, og det gir ingen mening for meg at det skulle fungere når den andre koden ikke gjør det:
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);
}
});
}
...i else-tilfellet gjør den nøyaktig det samme som koden over som genererer feilen, og likevel er det ingen feil.
Jeg kan fikse problemet bare ved å endre handleError til å være:
handleError = (error:any):Promise<any> => {
this.debug(error);
Promise.reject(error);
};
...men jeg er nysgjerrig på hva den spesifikke endringen var som gjorde at dette ble en feil, og hvorfor fungerer det riktig å legge til if/else-blokken når den har en else-path som er identisk med den opprinnelige koden?
Svar #1
Med TypeScript 2.4-utgivelsen har TypeScript blitt strengere med generics og Promise-callbacks, noe som vil forårsake problemer ved oppgraderinger, spesielt for de som bruker Promises. Jeg har lagt merke til dette i flere av mine apper. Du kan lese om det i utgivelsesnotatene for 2.4.