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
相关产品推荐
相关产品推荐

