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

TypeScript继承Error的类instanceof失效?Node.js与Vite差异及解决

自定义Error类instanceof判断失效的原因与解决办法

问题原因

在Node.js的CommonJS模块环境下(ts-node默认采用该模式),TypeScript编译自定义Error子类时会出现原型链断裂的问题。Error作为JavaScript内置对象,直接继承时,super()调用后实例的原型会指向Error.prototype而非自定义类的原型,导致instanceof CustomError返回false。而Vite构建的React应用默认使用ES模块,编译逻辑对类继承的处理更符合ES标准,原型链保持完整,所以判断能正常返回true。

解决办法

1. 手动修正原型链

在自定义Error类的构造函数中,显式设置实例的原型指向类的原型:

class CustomError extends Error {
  constructor(message?: string) {
    super(message);
    Object.setPrototypeOf(this, CustomError.prototype);
  }
}

2. 调整TypeScript编译配置

修改tsconfig.json,启用ES模块相关配置,确保编译后的代码正确处理继承:

{
  "compilerOptions": {
    "module": "ESNext",
    "target": "ES2022",
    "esModuleInterop": true
  }
}

同时启动ts-node时加上--esm参数,强制使用ES模块模式:

ts-node --esm your-file.ts

3. 替代instanceof的判断方式

如果不想修改原型或配置,可以通过自定义标识来判断:

  • 方式一:添加固定的name属性
class CustomError extends Error {
  name = 'CustomError';
  constructor(message?: string) {
    super(message);
  }
}

// 判断
console.log(err.name === 'CustomError'); // 返回true
  • 方式二:直接检查构造函数
console.log(err.constructor === CustomError); // 返回true

内容的提问来源于stack exchange,提问作者Dante Allievi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:53:20