Das Problem ist, dass die in Javascript integrierte Klasse Errordie Prototypenkette unterbricht, indem sie das zu erstellende Objekt (dh this) beim Aufrufen auf ein neues, anderes Objekt umschaltet superund das neue Objekt nicht die erwartete Prototypenkette hat, dh es ist eine Instanz von Errornicht vonCustomError .
Dieses Problem kann elegant mit 'new.target' gelöst werden, das seit Typescript 2.2 unterstützt wird. Siehe hier: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html
class CustomError extends Error {
constructor(message?: string) {
super(message);
const actualProto = new.target.prototype;
if (Object.setPrototypeOf) { Object.setPrototypeOf(this, actualProto); }
else { this.__proto__ = actualProto; }
}
}
Die Verwendung new.targethat den Vorteil, dass Sie den Prototyp nicht wie bei einigen anderen hier vorgeschlagenen Antworten fest codieren müssen. Das hat wieder den Vorteil, dass Klassen von erbenCustomError , automatisch auch die richtige Prototypkette erhalten.
Wenn Sie den Prototyp (z. B. Object.setPrototype(this, CustomError.prototype)) fest codieren CustomErrorwürden , hätte er selbst eine funktionierende Prototypkette, aber alle Klassen, die von erben, CustomErrorwürden beschädigt, z. B. class VeryCustomError < CustomErrorwären Instanzen von a nicht instanceof VeryCustomErrorwie erwartet, sondern nurinstanceof CustomError .
Siehe auch: https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200