problemem jest to, że JavaScript wbudowanego w klasie Error
przerywa łańcuch prototyp przełączając obiekt zostać skonstruowana (czyli this
) do nowego, innego obiektu, po wywołaniu super
, a nowy obiekt nie ma oczekiwanego łańcucha prototypów, tj.jest to instancja o numerze Error
, a nie CustomerError
.
Problem ten może być rozwiązany za pomocą elegancko „new.target”, który jest obsługiwany od maszynopis 2.2, zobacz tutaj: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html
class CustomError extends Error {
constructor(message?: string) {
// 'Error' breaks prototype chain here
super(message);
// restore prototype chain
const actualProto = new.target.prototype;
if (Object.setPrototypeOf) { Object.setPrototypeOf(this, actualProto); }
else { this.__proto__ = new.target.prototype; }
}
}
Korzystanie new.target
ma tę zaletę, że nie trzeba hardcode prototyp , podobnie jak inne proponowane tutaj odpowiedzi. To znowu ma tę zaletę, że klasy dziedziczące po CustomError
automatycznie uzyskają prawidłowy łańcuch prototypów.
Jeśli było zakodować prototyp (np Object.setPrototype(this, CustomError.prototype)
) CustomError
byłaby sama mieć działający łańcuch prototypów, ale wszelkie zajęcia dziedziczenie z CustomError
zostanie uszkodzony, np wystąpienia class VeryCustomError < CustomError
nie będą zgodne z oczekiwaniami, ale tylko instanceof CustomError
.
Zobacz także: https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200
Co 'ParameterUndefinedError'? –
@NitzanTomer To typo. Naprawiłem to, dzięki. – darksoulsong