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

脚本与模块中Declaration Merging效果差异的原因咨询

为什么扩展express-session的SessionData仅在模块文件生效

核心原因:TypeScript模块与脚本文件的作用域差异

  • 脚本文件(无顶层import/export):这类文件属于全局作用域,但你写的declare module 'express-session'会被TypeScript当成全新的模块定义,而非对已有express-session模块的扩展。全局作用域中的模块声明会被视为独立模块,和原第三方模块的类型系统完全割裂,所以你的SessionData接口无法和原模块的接口合并。
  • 模块文件(含顶层import/export):这类文件属于模块作用域,此时的declare module 'express-session'会被识别为模块扩展声明。TypeScript会自动将你定义的SessionData接口和原express-session模块中的同名接口合并,从而实现对req.session属性的类型扩展。

声明合并的规则限制

TypeScript对第三方模块的类型扩展有明确要求:必须在模块上下文内进行扩展。因为第三方模块本身是以模块形式存在的,只有在模块作用域中编写的模块扩展声明,才会被编译器关联到原模块的类型上,完成声明合并。全局作用域中的模块声明不具备这种关联能力,只会被当作独立的模块定义处理。

脚本文件的全局作用域适用场景

脚本文件的全局作用域适合扩展全局对象(比如Window、globalThis)的类型,但不适合扩展模块内部的接口。模块内部的接口属于模块自身的作用域,只能在模块上下文里进行扩展。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:10:28