TypeScript中Express自定义类型中间件类型报错如何解决?
你遇到的类型报错是因为自定义的IGetUserAuthInfoRequest是独立于Express原生Request的派生接口,不符合Express对标准中间件的RequestHandler类型入参要求,因此出现类型不匹配的问题。
解决方案:通过类型声明合并扩展Express原生Request接口
不需要自定义派生接口,直接通过TypeScript的声明合并能力,给Express自带的Request接口追加你需要的id属性即可,步骤如下:
- 新建类型声明文件
在项目源码目录下新建@types/express.d.ts文件,写入如下内容:
declare namespace Express { interface Request { // 在此处追加你需要扩展的所有自定义请求属性 id: number } }
- 配置tsconfig.json识别自定义类型
在tsconfig.json的compilerOptions字段中添加typeRoots配置,确保TypeScript能读取到你自定义的类型声明:
{ "compilerOptions": { // 其他原有配置保留 "typeRoots": ["./node_modules/@types", "./src/@types"] } }
- 调整原有代码的类型引用
不需要再使用自定义的IGetUserAuthInfoRequest接口,所有位置直接引用Express自带的Request类型即可:
- 中间件代码调整:
import { Request, Response, NextFunction } from "express"; export const verifyToken = (req: Request, res: Response, next: NextFunction) => { req.id = 1; // 类型合法,会正常提示id属性的类型 next(); }
- 路由代码调整:
app.get("/api/try/admin", verifyToken, (req: Request, res: Response) => { // 此处访问req.id也会有正确的类型提示 res.json({message: "try admin"}) });
该方案全程不需要用到any,所有自定义属性都有完整的类型校验和提示。
内容的提问来源于stack exchange,提问作者axtcknj
相关产品推荐
相关产品推荐

