MST
星途 面试题库

面试题:TypeScript 如何在 Express 中间件中正确扩展请求对象类型

假设你有一个 Express 应用,并且想在中间件中给请求对象(`req`)添加一个自定义属性 `user`,类型为 `{ name: string; age: number }`。请用 TypeScript 实现这个中间件,并展示如何正确声明 `req` 的类型扩展,确保在后续使用 `req.user` 时类型安全。
23.2万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. 首先,创建一个自定义的 Request 类型扩展:
    import { Request as ExpressRequest } from 'express';
    
    declare global {
        namespace Express {
            interface Request {
                user: { name: string; age: number };
            }
        }
    }
    
  2. 然后,实现中间件:
    import express, { Request, Response, NextFunction } from 'express';
    
    const app = express();
    
    const addUserMiddleware = (req: Request, res: Response, next: NextFunction) => {
        req.user = { name: 'John', age: 30 };
        next();
    };
    
    app.use(addUserMiddleware);
    
    app.get('/', (req: Request, res: Response) => {
        res.json({ user: req.user });
    });
    
    const port = 3000;
    app.listen(port, () => {
        console.log(`Server running on port ${port}`);
    });
    

在上述代码中,通过 declare global 扩展了 Express.Request 类型,为其添加了 user 属性。然后实现了一个中间件 addUserMiddleware,在这个中间件中给 req 对象添加了 user 属性。这样在后续路由处理函数中使用 req.user 时就具备类型安全了。