脚本与模块中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
相关产品推荐
相关产品推荐

