TypeScript为Error对象加属性时报错Property does not exist on type 'Error'
报错原因
TypeScript 对原生 Error 类型的默认定义里不包含 status 属性,所以会抛出 2339 类型错误。JavaScript 是动态类型语言,允许给任意对象追加自定义属性,所以原来的 JS 代码不会有问题,这种给 Error 追加 HTTP 状态码的写法本身也是 Express 生态里的常见用法,不属于错误写法。
可行解决方案
方案1:临时类型断言
适合临时使用的场景,直接用交叉类型明确标注该 Error 实例携带 status 属性即可:
const error = new Error('Not Found') as Error & { status: number }; error.status = 404;不推荐直接用
any类型断言,会丢失类型校验能力。方案2:全局扩展 Error 类型
适合项目里大量用到给 Error 加 status 属性的场景,在项目根目录新增类型声明文件
global.d.ts,添加如下内容:declare global { interface Error { status?: number; } } // 该文件需要作为模块导出,否则全局声明不生效 export {};配置后项目内所有 Error 实例都会默认带有可选的
status属性,不需要额外做类型处理。方案3:自定义 HTTP 错误类(推荐最佳实践)
类型安全性最高,也方便后续扩展其他错误相关属性,自定义类继承原生 Error 即可:
class HttpError extends Error { public status: number; constructor(message: string, statusCode: number) { super(message); this.status = statusCode; // 修复TS继承内置类时原型链指向异常的问题 Object.setPrototypeOf(this, HttpError.prototype); } } // 使用示例 const error = new HttpError('Not Found', 404);后续在 Express 错误处理中间件里也可以直接通过
instanceof HttpError做类型收窄,针对性处理自定义错误。
内容的提问来源于stack exchange,提问作者JimmyTheCode
相关产品推荐
相关产品推荐

