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

如何在TypeScript中为Express的Cookie正确定义类型?

在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-

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:16:13