问题在于,当您调用Javascript的内置类时Error,它通过将要构造的对象(即this)切换到新的不同对象来破坏原型链,super并且新对象没有预期的原型链,即它是一个实例。的Error不是CustomError。
使用'new.target'可以很好地解决此问题,该类型自Typescript 2.2开始受支持,请参见此处: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; }
}
}
使用new.target具有无需对原型进行硬编码的优势,就像这里建议的其他一些答案一样。再次具有的优点是,从其继承的类CustomError也将自动获得正确的原型链。
如果您要对原型进行硬编码(例如Object.setPrototype(this, CustomError.prototype)),CustomError它本身将具有一个有效的原型链,但是继承自的任何类CustomError都将被破坏,例如a的实例class VeryCustomError < CustomError将不是instanceof VeryCustomError预期的,而仅仅是预期的instanceof CustomError。
另请参阅:https : //github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200