typescript
v2.3.4 Mit dem folgenden Code hat gut funktioniert:Versprechen Rückgabetyp Fehler nach Typoskript Upgrade
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);
});
}
... wo handleError
ist wie folgt:
handleError = (error:any) => {
this.debug(error);
throw error;
};
Jetzt, mit typescript
v2 .4.1 Ich bekomme den Fehler: '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'.'
Ich kann sehen, warum das der Fall wäre.
... aber das funktioniert, und es macht mir keinen Sinn, dass es funktionieren würde, wenn der andere Code nicht:
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);
}
});
}
... im else
Fall wird es zu tun genau das, was Der obige Code erzeugt den Fehler und dennoch gibt es keinen Fehler.
ich das Problem, indem nur die Änderung handleError
beheben können sein:
handleError = (error:any):Promise<any> => {
this.debug(error);
Promise.reject(error);
};
... aber ich bin gespannt, was die spezifische Änderung, dass dies ein Fehler zu werden verursacht wurde, und warum die if/else
wirkt sich das Hinzufügen Block funktioniert ordnungsgemäß, wenn es einen anderen Pfad als den ursprünglichen Code hat?
Es sieht so aus, als ob ein Rückgabetyp von 'void' hinzugefügt wird, wenn es in den' then'/'catch' Blöcken keine Return-Anweisung gibt. Sobald Sie eine hinzufügen, wird versucht, den Rückgabetyp für diese Zeile (n) abzuleiten und nicht implizit "void" hinzuzufügen, auch wenn nicht alle Codepfade einen Wert zurückgeben. Warum das so ist, bin ich mir nicht sicher, vielleicht aufgrund des Designs oder vielleicht, weil das Verfolgen aller möglichen Codepfade in dem Transpiler schwierig war, so dass ein Fehler nicht ausgegeben werden konnte, oder vielleicht ein Fehler. – Igor
Das klingt vernünftig. Ich nehme auch an, dass die Tatsache, dass mein Code ursprünglich funktionierte, ein Fehler war und das aktuelle Verhalten nur ein Ergebnis dieses Fehlers ist, der behoben wurde. – WillyC