2017-07-11 6 views
1

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?

+2

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

+0

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

Antwort

2

Mit TypeScript 2.4 wurde TypeScript mit Generics und Promise-Callbacks strenger, was zu Problemen mit Upgrades führt, insbesondere zu denen, die Promises verwenden. Ich habe das in einigen meiner Apps bemerkt. Sie können read about it in den Versionshinweisen für 2.4.

Verwandte Themen