El problema es que la clase incorporada de Javascript Errorrompe la cadena de prototipos al cambiar el objeto que se va a construir (es decir this) a un objeto nuevo y diferente, cuando llama supery ese nuevo objeto no tiene la cadena de prototipos esperada, es decir, es una instancia de Errorno de CustomError.
Este problema se puede resolver elegantemente usando 'new.target', que es compatible desde Typecript 2.2, consulte aquí: 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; }
}
}
El uso new.targettiene la ventaja de que no tiene que codificar el prototipo, como algunas otras respuestas propuestas aquí. De nuevo, eso tiene la ventaja de que las clases heredadas CustomErrortambién obtendrán automáticamente la cadena de prototipos correcta.
Si tuviera que codificar el prototipo (p Object.setPrototype(this, CustomError.prototype). Ej. ), El CustomErrormismo tendría una cadena de prototipos en funcionamiento, pero cualquier clase heredada CustomErrorse rompería, p. Ej., Las instancias de a class VeryCustomError < CustomErrorno serían las instanceof VeryCustomErroresperadas, sino únicamente instanceof CustomError.
Véase también: https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200