You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中Custom类实例为何不被instanceof识别为自身类型?

为什么自定义Error子类的instanceof检测不符合预期?

这是TypeScript/JavaScript里继承内置Error类时的经典坑,我来给你详细解释原因和解决办法:

问题原因

内置的Error对象在JS引擎里有特殊的实现逻辑:当你在子类构造函数中调用super(message)时,它并不会像普通类那样修改当前的this上下文,而是返回一个全新的Error实例。这就导致你的Custom类构造函数最终返回的是这个由super生成的Error对象,而不是Custom类本身的实例——自然x instanceof Custom会返回false,但这个对象确实是Error的实例,所以x instanceof Error为true。

另外,如果你的TypeScript编译目标设置为ES5,这个问题会更突出,因为ES5的继承机制无法正确适配内置对象的这种特殊行为。

解决办法

有两种常用的方式可以修复这个问题:

1. 手动修正原型链

在构造函数中调用super之后,手动将实例的原型指向Custom的原型:

class Custom extends Error {
  constructor(message: string) {
    super(message);
    // 修正原型链,让实例属于Custom类
    Object.setPrototypeOf(this, Custom.prototype);
  }
}

2. 使用ES6+编译目标

在你的tsconfig.json中把编译目标设置为ES6或更高版本:

{
  "compilerOptions": {
    "target": "ES6"
    // 其他配置...
  }
}

当使用原生ES6 class语法编译时,JS引擎会正确处理内置Error类的继承,原型链会被自动设置好,不需要手动修正。

验证

修改后再运行你的代码:

const x = new Custom("");
console.log(x instanceof Custom); // true
console.log(x instanceof Error); // true

就会符合预期了。

内容的提问来源于stack exchange,提问作者mohamed ewasy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 10:05:23