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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:42:02