2017-12-22 12 views
1

Warum gibt dieser Code false zurück?Inherited exceptions und instanceof

class MyException extends Error { 
    constructor(message: string) { 
     super(message); 
    } 
} 

const e = new MyException('blah'); 
console.log(e instanceof MyException); // returns 'false' 

Es geschieht nicht, wenn ich den folgenden Code ausführen:

class Base { 
    constructor(message: string) { 
     console.log(message); 
    } 
} 

class MyClass extends Base { 
    constructor(message: string) { 
     super(message); 
    } 
} 

const e = new MyClass('blah'); 
console.log(e instanceof MyClass); // returns 'true' 
+0

Mögliche Duplikat [Typoskript - Erweiterung Fehlerklasse] (https://stackoverflow.com/questions/41102060/typescript-extending-error-class) – nemesv

Antwort

1

Es ist ein bekanntes Problem: instanceof is broken when class extends Error type zu zum Standard-Support-Polymer im Zusammenhang mit Typoskript Funktion.

Proposed Abhilfen sind:

  • eine Zwischenklasse zu schaffen
  • Einstellung der Prototyp

Leider ist dieses eine Änderung ist, dass wir versuchen gemacht zu versuchen, einen mehr Standard zu übernehmen -konformen emittieren, damit wir Polymer mit mit TypeScript arbeiten können.

Für Hintergrund, war eine absichtliche Änderung in 2.2 (siehe # 12123 und die Abschnitt in unserem Wiki), aber ist schwierig zu überwinden durch Kompilierung. Ich glaube, es gibt einige Diskussionen in # 12790 für Workarounds.

Eine Problemumgehung, die Sie jetzt durchführen können, ist das Erstellen einer Zwischenklasse, die Sie von aus erweitern können.

export interface MyErrorStatic { 
    new (message?: string): RxError; 
} 
export interface MyError extends Error {} 

export const MyError: MyErrorStatic = function MyError(this: Error, message: string) { 
    const err = Error.call(this, message); 
    this.message = message; 
    this.stack = err.stack; 
    return err; 
} as any; 

export class HttpError extends MyError { 
    // ... 
} 

In Typoskript 2.2, werden Sie den Prototyp auf eigene Faust setzen können.

// Use this class to correct the prototype chain. 
export class MyError extends Error { 
    __proto__: Error; 
    constructor(message?: string) { 
     const trueProto = new.target.prototype; 
     super(message); 

     // Alternatively use Object.setPrototypeOf if you have an ES6 environment. 
     this.__proto__ = trueProto; 
    } 
}