TypeScript自定义UserInputError继承Error后instanceof判断失效原因咨询
catch(e: any)里的any是TS类型标注,只影响编译阶段的类型检查,和JS运行时的instanceof逻辑完全无关,所以可以先排除这个原因。
核心原因
1. TS低版本编译目标的内置类继承缺陷
如果你当前项目的tsconfig.json中target配置为ES5或更低版本,会出现这个问题。ES5的原型继承机制无法完美支持继承Error、Array、Map等JS内置构造函数,TS转译时会破坏自定义错误类实例的原型链,导致instanceof判断失效,这是TS已知的兼容问题。
2. 模块重复加载导致构造函数引用不一致
如果抛出错误的代码和捕获错误的代码,导入UserInputError时用了不同的路径(比如一个用./UserInputError,另一个用../errors/UserInputError),或者打包时该类被重复打包了两次,会导致两个上下文拿到的UserInputError是完全独立的两个构造函数,实例的原型自然不属于另一个构造函数,instanceof就会返回false。
解决方案
- 针对编译目标问题:
- 优先将
tsconfig.json的target改为ES2015及更高版本,Node.js 8及以上版本完全支持ES2015语法,不存在兼容问题。 - 如果必须兼容ES5,手动修正实例原型,修改构造函数代码即可:
export default class UserInputError extends Error { constructor(message: string) { super(message); this.name = "UserInputError"; // 新增该行手动修复原型链 Object.setPrototypeOf(this, UserInputError.prototype); } }
- 优先将
- 针对模块重复加载问题:
统一项目内所有导入UserInputError的路径,检查打包配置避免重复打包同一模块,确保全局只有一个UserInputError构造函数的引用。
内容的提问来源于stack exchange,提问作者Abdullah Khaled
相关产品推荐
相关产品推荐

