8

I have the Child class that extends Parent class. So let say I created a new instance "child" out of the Child class. When I check the condition child instanceof Child, it returns false. However, child instanceof Parent returns true.

Why does this so?

EDIT

So I found this only happens when I extend the Child class with Error class. Let me leave the code example below.

class Child extends Error {
  constructor(message) {
    super(message);
  }
}
const ch = new Child();
console.log(ch instanceof Child);

2nd EDIT

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;
  }
}
11
  • @CertainPerformance I added my code example. I actually had Child class inherited from javascript Error class. Commented Jul 8, 2018 at 7:03
  • this doesn't look like javascript. are you sure you're not using java? Commented Jul 8, 2018 at 7:05
  • 2
    @PhilippSander Have you never seen a JavaScript class before? Commented Jul 8, 2018 at 7:06
  • I never saw "constructor". it was just a question. I may be wrong. Commented Jul 8, 2018 at 7:07
  • @PhilippSander Welcome to ES2015 :P Commented Jul 8, 2018 at 7:08

1 Answer 1

13

This is a documented bug:

https://github.com/Microsoft/TypeScript/issues/15875

Extending built-ins like Error, Array, and Map may no longer work

As part of substituting the value of this with the value returned by a super(...) call, subclassing Error, Array, and others may no longer work as expected. This is due to the fact that constructor functions for Error, Array, and the like use ECMAScript 6's new.target to adjust the prototype chain; however, there is no way to ensure a value for new.target when invoking a constructor in ECMAScript 5. Other downlevel compilers generally have the same limitation by default.

The recommendation is to adjust the prototype manually using setPrototypeOf in the constructor. A fix for your PullCreditError class would look like this:

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;
  }
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.