class DatabaseError extends Error {}
const error = new DatabaseError("Unique constraint violation");
// prints "true"
console.log(error instanceof Error);
// incorrectly prints "false"
console.log(error instanceof DatabaseError);
    Enter fullscreen mode
    Exit fullscreen mode
class DatabaseError extends Error {
    constructor(message: string) {
        super(message);
        Object.setPrototypeOf(this, DatabaseError.prototype);
const error = new DatabaseError("Unique constraint violation");
// both print "true" now
console.log(error instanceof Error);
console.log(error instanceof DatabaseError);
    Enter fullscreen mode
    Exit fullscreen mode
class DatabaseError extends Error {
    constructor(message: string) {
        super(message);
        Object.setPrototypeOf(this, DatabaseError.prototype);
class DatabaseConnectionError extends DatabaseError {
    constructor(message: string) {
        super(message);
        Object.setPrototypeOf(this, DatabaseConnectionError.prototype);
const error = new DatabaseConnectionError("Invalid credentials");
// all print "true"
console.log(error instanceof Error);
console.log(error instanceof DatabaseError);
console.log(error instanceof DatabaseConnectionError);
    Enter fullscreen mode
    Exit fullscreen mode

Remember that this is only an issue if your compilation target is ES3 or ES5. Instead of having to remember to set the prototype, you could consider upgrading your target to ES 2015 or even later. ES 2015 has over 97% browser support, so it may be a reasonable choice for you, especially if you are okay with dropping support for Internet Explorer.

Built on Forem — the open source software that powers DEV and other inclusive communities.

Made with love and Ruby on Rails. DEV Community © 2016 - 2025.