2016-07-21 9 views
0

ich zur Zeit des folgenden Code bin mit Ausnahmen behandeln:Angular2 Exception - überprüfen, ob Fehlerobjekt Response ist

@Injectable() 
export class CustomExceptionHandler extends ExceptionHandler { 
call(error, stackTrace = null, reason = null) { 
    console.warn(error); 
} 

Der Code funktioniert gut, kann ich den Fehler in der Konsole sehen. Der Fehler ist ein Response-Objekt, das in @ angular/core definiert ist. Der Fehlerparameter ist jedoch "any". Ich kann den Fehlertyp nicht ändern (z. B. Fehler: Antwort), da es sich nicht unbedingt um ein Antwortobjekt handelt, es könnte alles sein.

Ich wollte verwenden (Fehler instanceof Response), aber das wird nicht funktionieren, weil Fehler eine Art von Objekt ist, die Sinn macht.

UPDATE

So stellt sich (error instanceof Response) tut, nachdem alle Arbeiten aus. Aus irgendeinem Grund scheint es nicht zu funktionieren, wenn Sie das Typoskript mit VS-Code debuggen. Ich habe darauf geachtet und es ist immer falsch zurückgekehrt. Vielleicht ist es, weil ich nicht zur Laufzeit

Wie auch immer, ist wichtig, was die Überprüfung bin, dass Objekte im Zusammenhang mit den Angular2 Antwort wird instanceof gut funktionieren, wie sie einen Konstruktor

dankt @DanSimon tun hat für Es hilft dabei, einzuschränken, was falsch gelaufen ist, und andere Möglichkeiten zu bieten, um den Typ eines Objekts zu überprüfen!

Antwort

1

Interessante Frage. Da TypeScript sich wirklich nur auf JS kompiliert, existieren Klassen nicht wirklich. Ich kann mir zwei Möglichkeiten vorstellen, wie Sie überprüfen können, Sie können einen "benutzerdefinierten Typschutz" verwenden oder den "instanceof type guard" verwenden. Der benutzerdefinierte Typ-Schutz ist nur eine raffinierte Möglichkeit, eine Eigenschaft/Funktion des Objekts zu überprüfen, um seinen Typ zu bestimmen. Der Vorteil ist, dass TS sich nicht über eine "fehlende Eigenschaft/Funktion" beschweren wird. Die Verwendung von "instanceof" funktioniert jedoch nur, wenn das Objekt einen Konstruktor hat, da es die beiden Konstruktoren des Objekts vergleicht. Wenn Ihr Objekt also keinen Konstruktor hat, ist es ein Nein. Sie finden die Dokumentation für diese beiden here.

Ich machte auch eine plunker zeigt, wie sie funktionieren. Die Ergebnisse werden in die Konsole geladen. Verwenden Sie daher Ihr Browser-Debug-Tool, um die Ergebnisse anzuzeigen. Alle Arbeiten werden an "app/child.component.ts" in der Funktion "ngOnChanges" ausgeführt.

ngOnChanges(changes: {[propertyName: string]: SimpleChange}) { 
    console.log(); 
    console.log("Custom function isSimpleChange:", this.isSimpleChange(changes)); 
    console.log("Using instanceof SimpleChange:", (changes instanceof SimpleChange)); 
    console.log("Using Object.prototype.toString.call():", Object.prototype.toString.call(changes)); 
    console.log("Logging the object itself:",changes); 
    console.log("-----------------------------------------------------------------------------------------"); 
    let testExample = new ExampleObject(); 
    console.log("Custom function isExampleObject:", this.isExampleObject(testExample)); 
    console.log("Using instanceof ExampleObject:", (testExample instanceof ExampleObject)); 
    console.log("Using Object.prototype.toString.call():" + Object.prototype.toString.call(testExample)); 
    console.log(testExample); 


    this._result = changes.value.currentValue; 
    this._changes++; 
} 

Sie werden wahrscheinlich brauchen beides zu nutzen und „typeof“ für Ihren Urtyp auch eine komplette Inspektion des Objekts zu tun. Also "typeof" verwenden, um nach den Grundtypen "string", "number", "boolean" zu suchen. Dann "instanceof" verwenden, um zu sehen, ob die Konstruktoren übereinstimmen, und schließlich einen "User-Defined Type Guard" verwenden, um nach bestimmten "Eigenschaften/Funktionen" zu suchen.