TypeScript中如何覆盖any类型属性?Express请求接口定制
方法一:模块扩充(全局修改)
这是TypeScript扩展第三方库类型的标准方案,直接修改Express的Request接口定义,全局生效:
- 在项目根目录创建
types/express/index.d.ts文件(没有types目录就新建) - 写入以下代码:
import type { Request } from 'express'; type MyCookies = { apple?: string; banana?: string; }; declare module 'express' { interface Request { cookies?: MyCookies; } }
- 确保
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
相关产品推荐
相关产品推荐

