拓展-01-Express 类型扩展笔记

发布时间:2026/10/14 22:27:25
拓展-01-Express 类型扩展笔记 1. Express 的类型是怎么设计的types/express故意留了一个「可扩展的口子」。在types/express-serve-static-core里大致是这样declareglobal{namespaceExpress{// 空接口专门给你扩展用的interfaceRequest{}interfaceResponse{}}}exportinterfaceRequest...extendshttp.IncomingMessage,Express.Request{// get、params、body 等都在这里}关键关系你扩展的 Express.Request全局 ↑ 继承 express 导出的 Request所以不是直接改import { Request } from express的定义而是扩展全局的Express.Request。扩展成功后所有extends Express.Request的地方都会自动带上你的字段。2. 声明合并TypeScript 的核心机制TypeScript 允许同名interface自动合并interfaceUser{name:string;}interfaceUser{age:number;}// 等价于// interface User { name: string; age: number; }namespaceinterface也支持合并namespaceExpress{interfaceRequest{userId?:number;}}// 会和 types/express 里已有的 Express.Request 合并记住一条规则interface可以合并type别名不行。3. 为什么需要declare global你的增强写在自己的文件里不是在types/express包内部。文件有两种身份身份判断条件顶层声明落在哪脚本script没有import/export直接进全局模块module有import或export只在模块内不进全局Express命名空间定义在全局里。你的.d.ts如果是模块里面的namespace Express默认只是模块局部的合并不了全局那个。下面两种写法二选一不要两种都写。模块写法推荐— 文件里会有import/export例如配合export {}时使用declareglobal{namespaceExpress{interfaceRequest{userId?:number;}}}含义「虽然这个文件是模块但请把里面的声明放进全局作用域。」脚本写法— 整个.d.ts没有任何import/export时可直接写namespaceExpress{interfaceRequest{userId?:number;}}怎么选这个 .d.ts 里会不会出现 import ├── 不会 → 直接写 namespace Express { ... } 就行 └── 会 / 不确定 → 用 declare global export {}4. 为什么需要export {}declare global只能在模块里用。你的文件如果只有declare global { ... }没有import/exportTypeScript 会把它当脚本declare global要么报错要么不生效。export{};作用把文件标记成模块且不导出任何实际值.d.ts编译后不会产生 JS这是社区里最常用的「零副作用模块标记」等价写法还有importexpress;// 也可以但会多一层对 express 的依赖引用exporttype{};// 也可以口诀用了declare global文件末尾就要有import或export。5. 你的文件逐块理解完整心智模型declareglobal{// ① 在模块里把下面内容注入全局namespaceExpress{// ② 找到全局 Express 命名空间interfaceRequest{// ③ 与已有 Request 合并不是覆盖userId?:number;// ④ 新增可选字段}}}export{};// ⑤ 让本文件成为模块① 才合法五句话对应五个概念全局注入 → 命名空间 → 接口合并 → 字段定义 → 模块标记。6.tsconfig.json的include要覆盖到它类型声明文件要被 TypeScript 读到include需覆盖到.d.ts所在目录。例如本项目的配置{compilerOptions:{xxx},include:[**/*.ts],exclude:[node_modules]}其中include: [**/*.ts]会匹配**/*.d.ts因此src/types/express.d.ts会被纳入编译。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询