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

如何在TypeScript中嵌套模块以支持单对象导入?

实现符合要求的TypeScript库

你之前的写法出错是因为TypeScript的namespace(也就是你用的module关键字,现在官方更推荐用namespace)内部不允许使用export { ... } from ...这种重新导出语法,这是语法层面的限制。

下面给两种可行的实现方式,推荐用第一种ES模块方案,更符合现代库开发的规范:

方案一:ES模块嵌套导出(推荐)

这种方式用ES模块的结构来构建层级,兼容性更好,也符合TypeScript的最佳实践:

  1. 项目结构示例:
my-library/
├── index.ts          # 库的入口文件
├── MyModule/
│   ├── index.ts
│   └── MySubModule/
│       └── index.ts
  1. 编写MySubModule/index.ts:
// 实现你的方法
export const myMethod = () => {
  console.log('执行myMethod');
};

// 导出子模块对象
export const MySubModule = {
  myMethod
};
  1. 编写MyModule/index.ts:
import { MySubModule } from './MySubModule';

// 导出模块对象,包含子模块
export const MyModule = {
  MySubModule
};
  1. 编写根目录的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 08:01:14