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

TypeScript中如何覆盖any类型属性?Express请求接口定制

解决Express Request接口cookies类型覆盖问题

方法一:模块扩充(全局修改)

这是TypeScript扩展第三方库类型的标准方案,直接修改Express的Request接口定义,全局生效:

  1. 在项目根目录创建types/express/index.d.ts文件(没有types目录就新建)
  2. 写入以下代码:
import type { Request } from 'express';

type MyCookies = {
  apple?: string;
  banana?: string;
};

declare module 'express' {
  interface Request {
    cookies?: MyCookies;
  }
}
  1. 确保tsconfig.json的typeRoots包含该types目录(默认已包含,未配置可添加:"typeRoots": ["./node_modules/@types", "./types"])

之后项目里所有使用express.Request的地方,cookies都会是MyCookies类型,无需再定义MyRequest。

方法二:局部自定义类型(Omit移除原有属性)

如果不想全局修改,只想在特定模块使用自定义Request类型,可用Omit移除原有cookies属性后再扩展:

import type { Request } from 'express';

type MyCookies = {
  apple?: string;
  banana?: string;
};

// 移除Request里的cookies属性,再合并自定义的cookies
type MyRequest = Omit<Request, 'cookies'> & {
  cookies: MyCookies;
};

// 使用示例
const request: MyRequest = /* 请求实例 */;
request.cookies.apple; // 类型为string | undefined,不再是any

为什么原继承方式无效?

TypeScript接口继承时,同名属性会做类型合并:原有cookies?: any和自定义cookies: MyCookies合并后为cookies?: any | MyCookies,而any是顶级类型,会覆盖所有其他类型,最终还是any。用Omit可彻底移除原有属性,避免类型合并冲突;模块扩充则直接替换原有属性类型,从根源解决问题。

内容的提问来源于stack exchange,提问作者hee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:35:20