如何在TypeScript中为Express的Cookie正确定义类型?
你的问题核心是直接重写Request交叉类型里的cookies字段,导致和Express内置的cookies类型冲突,最终jwt被推断为any。可以通过两种方式解决:
方法一:全局扩展Express的Cookie类型
这种方式适合整个项目都需要用到该Cookie类型的场景,不需要每次定义自定义Request类型:
// 可放在项目的类型声明文件中(比如src/types/express.d.ts) declare module 'express-serve-static-core' { interface Request { // 扩展$USER字段 $USER: Administrator; } // 扩展Cookie接口,添加jwt字段的类型 interface Cookie { jwt: string; } } // 路由代码部分 import Administrator from '@/models/Administrator' import { NextFunction, Request, Response } from 'express' type DemoRoute = (req: Request, res: Response, next: NextFunction) => void export const demoRoute: DemoRoute = (req, res, next) => { const loggedInUser = req.$USER; // 类型:Administrator const jwt = req.cookies.jwt; // 类型:string }
原理:通过TypeScript的模块扩展机制,直接扩展Express内置的Request和Cookie接口,TypeScript会自动合并这些类型,既保留原有字段的类型,又添加自定义的类型定义。
方法二:局部交叉类型合并(不全局扩展)
如果只需要在特定路由中使用该类型,可以通过交叉类型合并原有cookies类型,避免直接覆盖:
import Administrator from '@/models/Administrator' import { NextFunction, Request, Response } from 'express' // 正确合并cookies类型,而非直接覆盖 type ProtectedRequest = Request & { $USER: Administrator; cookies: Request['cookies'] & { jwt: string; }; } type DemoRoute = (req: ProtectedRequest, res: Response, next: NextFunction) => void export const demoRoute: DemoRoute = (req, res, next) => { const loggedInUser = req.$USER; // 类型:Administrator const jwt = req.cookies.jwt; // 类型:string }
原理:Request['cookies']会引用Express内置的cookies类型,再通过交叉类型&添加jwt: string,这样既保留了其他Cookie字段的原有类型,又为jwt指定了string类型,解决了直接覆盖导致的类型异常问题。
内容的提问来源于stack exchange,提问作者Islam Y-
相关产品推荐
相关产品推荐

