TypeScript报错:ErrorRequestHandler类型不存在'message'属性如何解决
问题根因
你误用了ErrorRequestHandler的类型定义:它是Express错误处理中间件整个函数的类型,而非第一个错误参数err的类型。将函数类型赋值给错误实例的类型约束,自然会找不到message、stack等Error实例的属性,和tsconfig的typeRoots、types配置无关,你之前的调整自然无法解决问题。
修复方案
方案1:给整个中间件函数标注类型(更推荐)
直接用ErrorRequestHandler约束函数本身,TS会自动推导所有入参的类型,无需单独给每个参数标注:
import { ErrorRequestHandler } from 'express'; const errorHandler: ErrorRequestHandler = (err, _req, res, _next) => { const statusCode = res.statusCode === 200 ? 500 : res.statusCode; res.status(statusCode); res.json({ message: err.message, stack: process.env.NODE_ENV === 'production' ? undefined : err.stack }) }
方案2:单独给err参数标注正确类型
如果要单独给每个参数加类型,err的基础类型是JS内置的Error,如果有自定义错误字段可以扩展类型:
import { Request, Response, NextFunction } from 'express'; // 有自定义错误属性可以写成 err: Error & { statusCode?: number, code?: string } const errorHandler = ( err: Error, _req: Request, res: Response, _next: NextFunction ) => { // 原有逻辑不变 }
内容的提问来源于stack exchange,提问作者user17399782
相关产品推荐
相关产品推荐

