我有扩展父类的Child类。
因此,可以说我从Child类中创建了一个新实例“ child”。
当我检查条件child instanceof Child
时,它返回false。
但是,child instanceof Parent
返回true。
为什么这样做?
编辑
因此,我发现只有在将Child类扩展为Error类时才会发生这种情况。 让我在下面留下代码示例。
class Child extends Error {
constructor(message) {
super(message);
}
}
const ch = new Child();
console.log(ch instanceof Child);
第二次编辑
class PullCreditError extends Error {
public name: string;
public message: string;
public attemptsRemaining: number;
constructor(message: string, attemptsRemaining: number) {
super();
Error.captureStackTrace(this, PullCreditError);
this.name = 'PullCreditError';
this.message = message;
this.attemptsRemaining = attemptsRemaining;
}
}
答案 0 :(得分:1)
这是一个已记录的错误:
https://github.com/Microsoft/TypeScript/issues/15875
扩展内置错误,数组和映射之类的功能可能不再起作用
用super(...)调用返回的值代替this的值时,将Error,Array和其他类子类化可能不再按预期工作。这是由于Error,Array等的构造函数使用ECMAScript 6的new.target来调整原型链的事实。但是,在ECMAScript 5中调用构造函数时,无法确保new.target的值。默认情况下,其他下层编译器通常具有相同的限制。
建议在构造函数中使用setPrototypeOf
手动调整原型。您的PullCreditError
类的修复如下所示:
export class PullCreditError extends Error {
public name: string;
public message: string;
public attemptsRemaining: number;
constructor(message: string, attemptsRemaining: number) {
super();
Object.setPrototypeOf(this, PullCreditError.prototype); // <-------
Error.captureStackTrace(this, PullCreditError);
this.name = 'PullCreditError';
this.message = message;
this.attemptsRemaining = attemptsRemaining;
}
}