如何在TypeScript中嵌套模块以支持单对象导入?
实现符合要求的TypeScript库
你之前的写法出错是因为TypeScript的namespace(也就是你用的module关键字,现在官方更推荐用namespace)内部不允许使用export { ... } from ...这种重新导出语法,这是语法层面的限制。
下面给两种可行的实现方式,推荐用第一种ES模块方案,更符合现代库开发的规范:
方案一:ES模块嵌套导出(推荐)
这种方式用ES模块的结构来构建层级,兼容性更好,也符合TypeScript的最佳实践:
- 项目结构示例:
my-library/ ├── index.ts # 库的入口文件 ├── MyModule/ │ ├── index.ts │ └── MySubModule/ │ └── index.ts
- 编写
MySubModule/index.ts:
// 实现你的方法 export const myMethod = () => { console.log('执行myMethod'); }; // 导出子模块对象 export const MySubModule = { myMethod };
- 编写
MyModule/index.ts:
import { MySubModule } from './MySubModule'; // 导出模块对象,包含子模块 export const MyModule = { MySubModule };
- 编写根目录的
index.ts:
import { MyModule } from './MyModule'; // 导出顶层库对象 export const MyLibrary = { MyModule };
这样用户导入后就能按照你想要的方式调用:
import { MyLibrary } from 'my-library'; MyLibrary.MyModule.MySubModule.myMethod();
方案二:使用Namespace(不推荐,仅作兼容参考)
如果一定要用namespace,需要先把模块导入到局部变量,再在namespace内部导出这个变量,不能直接用export { ... } from:
// index.ts // 先导入子模块 import { MySubModule } from './my-module/my-sub-module/MySubModule'; export namespace MyLibrary { export namespace MyModule { // 将导入的子模块作为namespace的属性导出 export const MySubModule = MySubModule; } }
这种方式虽然能解决错误,但namespace更适合全局环境下的代码隔离,现代库开发更推荐用ES模块的方式,因为它和ES6模块规范一致,打包工具兼容性更好。
内容的提问来源于stack exchange,提问作者Jacopo Lanzoni
相关产品推荐
相关产品推荐

