JavaScript转TypeScript:错误处理逻辑迁移遇问题求指导
Node.js下JavaScript错误处理迁移到TypeScript的解决方案
在TypeScript中,catch捕获的错误默认类型是unknown,这是TS的安全设计——因为抛出的错误不一定是Error实例。同时,原生Error类型并没有status属性,所以直接赋值会触发类型错误。下面是几种可行的解决方式:
方案一:自定义HTTP错误类(推荐)
创建继承自Error的自定义错误类,显式添加status属性,这是最规范、类型最安全的做法:
class HttpError extends Error { status: number; constructor(message: string, status: number) { super(message); this.status = status; // 修复原型链,确保instanceof判断正常工作 Object.setPrototypeOf(this, HttpError.prototype); } } // 业务代码中的错误处理 try { // 执行业务逻辑,比如调用数据库、第三方接口等 // 如果需要主动抛错,直接使用自定义类: // throw new HttpError('数据库查询失败', 500); } catch (err) { if (err instanceof HttpError) { // 直接处理带status的自定义错误 throw err; } else if (err instanceof Error) { // 将原生Error包装为自定义HttpError const wrappedErr = new HttpError(err.message, 500); throw wrappedErr; } else { // 处理非Error类型的错误(比如抛出的是字符串、数字) const unknownErr = new HttpError('未知错误', 500); throw unknownErr; } }
方案二:全局扩展Error接口
如果不想创建新的错误类,可以通过全局声明扩展Error的类型,让TS识别status属性:
// 在项目的类型声明文件(比如global.d.ts)中添加: declare global { interface Error { status?: number; } } // 业务代码中的错误处理 try { // 业务逻辑代码 } catch (err) { if (err instanceof Error) { err.status = 500; // 现在TS不会报错 throw err; } else { // 非Error类型转为带status的Error const error = new Error(String(err)); error.status = 500; throw error; } }
方案三:类型断言(快速临时方案)
如果只是临时解决问题,可以用类型断言绕过TS的类型检查,但这种方式安全性较低,不推荐在生产代码中大量使用:
try { // 业务逻辑代码 } catch (err) { if (err instanceof Error) { // 断言err为带有status属性的对象 (err as { status?: number }).status = 500; throw err; } else { console.log('非Error类型错误:', err); // 或者抛出一个标准的带status的错误对象 throw { message: String(err), status: 500 }; } }
注意事项
- 始终先对
err做类型收窄(比如instanceof Error),避免直接操作unknown类型的属性; - 如果是第三方库抛出的错误,需要先确认错误的结构,再选择对应的处理方式;
- 自定义错误类时,务必修复原型链,否则
instanceof判断会失效。
内容的提问来源于stack exchange,提问作者Pawan
相关产品推荐
相关产品推荐

