2016-06-08 6 views
0

ich diese einfache Funktion haben, die console debuggerinstanceOf gibt false zurück, obwohl Debugger zeigt das Objekt

ich aber falsch liefert true zurückgeben sollte, aber Konsole Debugger zeigt, dass dies das Objekt UIError ist. Trotzdem:

exception.originalException instanceOf UIError 

gibt false zurück! Ich sehe im Debugger, dass es in der Tat eine UIError-Klasse ist. Warum ?

UIError erweitert Fehlerklasse

enter image description here

private isAnUIError(exception: any): boolean { 
    return (exception.originalException) instanceof UIError || exception instanceof UIError; 
} 

export class UIError extends Error { 
constructor (private message: string) { 
super(); 
this.message = message; 
} 
+1

Was ist 'UIError'? – Oriol

+1

Nicht sicher, könnte es sein, dass es * die * 'UIError' * Klasse * selbst ist? Versuchen Sie 'exception.originalException == UIError'. Oder funktioniert mindestens 'exception.originalException instanceof Error'? – Bergi

+0

UIError extends Fehler –

Antwort

0

Wenn Typoskript etwas ist wie Babel ES6 Error kann nicht wie eine normale Klasse erweitert werden könnte. Das ist fiese Warze in JavaScript. Die Aufgabe besteht darin, den Prototyp des neuen Fehlers direkt zu verwalten. Ich erklärte dies in another SO Answer in Bezug auf ES6 und Babel tranpiling.

Hier ist, wie ich würde dies erwarten aussehen:

class UIError { 
    constructor(message) { 
    this.name = 'UIError'; 
    this.message = message; 
    this.stack = new Error().stack; // Optional 
    } 
} 
UIError.prototype = Object.create(Error.prototype); 

Beachten Sie, dass super() nichts tut mit Error weil Error ist nicht eine typische Konstruktionsfunktion (Klasse). Es bedeutet nichts

Error.apply(this, [].slice.call(arguments, 0)) 

auszuführen (das ist im Wesentlichen, was ein super() der Fall ist), da die Error() Funktion tut nichts mit this sondern gibt einen neuen Fehler. Dies ist ein bekannter Vorbehalt bezüglich Error in JavaScript.

+0

Sie müssen zwischen ES5-Fehlerimplementierungen und ES6-Implementierungen unterscheiden. – Bergi

+0

Ich habe Ihren Ansatz versucht, aber habe: "TypeError: Kann nicht zu lesen Eigenschaft 'Prototyp' der Funktion 'Klasse MyError'" – rideronthestorm

+0

@rinderonthestorm Ich denke, Babel ist im Übergang. Um den Fehler zu beheben, benutzen Sie nicht 'class' und gehen Sie zurück zu' function'. Ich denke auch, dass neuere Versionen von babel es erlauben, 'Error' wie erwartet zu erweitern. Nicht sicher. – Sukima