TypeScript命名空间聚合导入重导出问题:命名空间无导出内容
解决TypeScript模块聚合到命名空间重新导出的问题
你遇到的问题其实是因为TypeScript里模块和命名空间的导出机制不匹配,直接用export module A.something { export * from A; }的写法并不会把模块A的内容正确挂载到A.something这个命名空间下。下面给你几个可行的解决方案:
方案1:用命名空间统一包裹模块内容(推荐)
创建一个聚合文件(比如index.ts),先导入所有模块的内容,再通过顶层命名空间重新导出:
// 先导入A、B、C模块的所有导出内容 import * as A from './A'; import * as B from './B'; import * as C from './C'; // 定义顶层命名空间,把模块内容挂载到对应子属性下 export namespace something { export { A }; export { B }; export { C }; }
之后你就可以通过something.A、something.B来访问对应模块的所有导出内容了。
方案2:为每个模块单独创建嵌套命名空间
如果一定要实现A.something、B.something这种结构,可以这样写:
// 处理模块A import * as allFromA from './A'; export namespace A { export namespace something { // 把模块A的所有内容导出到这个子命名空间 export = allFromA; } } // 处理模块B import * as allFromB from './B'; export namespace B { export namespace something { export = allFromB; } } // 处理模块C同理 import * as allFromC from './C'; export namespace C { export namespace something { export = allFromC; } }
这样你就能通过A.something.xxx访问模块A里的导出项了。
方案3:用ES模块对象导出(更符合现代TS实践)
现在TypeScript更推荐使用ES模块的方式,而非传统命名空间,你可以直接导出包含子属性的对象:
import * as A from './A'; import * as B from './B'; import * as C from './C'; export const A = { something: A }; export const B = { something: B }; export const C = { something: C };
这种写法更简洁,也符合ES模块的规范,导入后直接用A.something就能访问模块内容。
为什么你的原写法不行?
你原来的export module A.something { export * from A; }其实存在两个问题:
module A.something这种写法并不是创建嵌套在A下的something命名空间,而是声明了一个名为A.something的独立模块(模块名包含.是不规范的)。- 在模块内部使用
export * from A时,并不会把外部模块A的内容导入到当前这个A.something模块里,因为export * from是用于模块顶层的导出转发,不能直接在命名空间内部这样使用。
内容的提问来源于stack exchange,提问作者Hectim
相关产品推荐
相关产品推荐

