编程进阶网 编程进阶网
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接

杨充

专注编程 · 终身学习者
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接
  • README
  • Android提升进阶

  • iOS开发和进阶

  • Web开发和进阶

    • README
    • HTML工具手册

    • TypeScript入门

      • README
      • 语言基础
      • 类和对象
      • 高级类型
      • 模块系统
        • 01.模块基本概念
        • 02.导出
          • 2.1 导出变量、函数、类
          • 2.2 默认导出
          • 2.3 重新导出
          • 2.4 来看一个案例
        • 03.导入
          • 3.1 导入命名导出
          • 3.2 导入默认导出
          • 3.3 导入所有内容
        • 04.模块解析
          • 4.1 相对路径导入
          • 4.2 非相对路径导入
        • 05.模块的编译
        • 06.模块与命名空间
          • 6.1 命名空间
          • 6.2 避免命名冲突
          • 6.3 模块与命名空间结合
          • 6.4 命名空间原理
          • 6.5 模块VS命名空间
          • 6.6 最佳实践建议
        • 07.动态导入
        • 08.模块类型声明
          • 8.1 声明模块
          • 8.2 导入类型
          • 8.3 模块最佳实践
      • 实用工具
    • Vue高级进阶

  • Linux应用开发

  • Apps
  • Web开发和进阶
  • TypeScript入门
杨充
2025-02-22
目录

模块系统

# 04.模块系统

# 目录介绍

  • 01.模块基本概念
  • 02.导出
    • 2.1 导出变量、函数、类
    • 2.2 默认导出
    • 2.3 重新导出
    • 2.4 来看一个案例
  • 03.导入
    • 3.1 导入命名导出
    • 3.2 导入默认导出
    • 3.3 导入所有内容
  • 04.模块解析
    • 4.1 相对路径导入
    • 4.2 非相对路径导入
  • 05.模块的编译
  • 06.模块与命名空间
    • 6.1 命名空间
    • 6.2 避免命名冲突
    • 6.3 模块与命名空间结合
    • 6.4 命名空间原理
    • 6.5 模块VS命名空间
    • 6.6 最佳实践建议
  • 07.动态导入
  • 08.模块类型声明
    • 8.1 声明模块
    • 8.2 导入类型
    • 8.3 模块最佳实践

TypeScript 的模块系统是基于 ES 模块(ES Modules)的,它允许开发者将代码拆分为多个文件,并通过导入和导出的方式组织代码。

TypeScript 的模块系统与 JavaScript 的模块系统兼容,同时提供了更强大的类型支持。

# 01.模块基本概念

  • 模块:一个独立的文件,包含代码和类型定义。
  • 导出:将模块中的变量、函数、类等暴露给其他模块使用。
  • 导入:从其他模块中引入导出的内容。

# 02.导出

# 2.1 导出变量、函数、类

使用 export 关键字导出内容。

// 导出变量
export const PI = 3.14;

// 导出函数
export function add(x: number, y: number): number {
    return x + y;
}

// 导出类
export class Calculator {
    static multiply(x: number, y: number): number {
        return x * y;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 2.2 默认导出

每个模块可以有一个默认导出,使用 export default。

// logger.ts
export default function log(message: string): void {
    console.log(message);
}
1
2
3
4

# 2.3 重新导出

使用 export ... from 语法重新导出其他模块的内容。

// utils.ts
export { add, PI } from "./math";
1
2

# 2.4 来看一个案例

两个函数的功能完全一样:

// 函数1 - 箭头函数 + const。没有显式声明返回类型,TypeScript自动推断为 void
export const showDefaultDebugBackground1 = (light?: UI.CustomCameraLight) => {
  UI.TemplateUI.render({
    background: 'black',
    foreground: {
    type: 'image',
    imagePath: 'res/imgs/afs_bg_debug.png',
    },
    customCameraLight: light ?? 'green_lowlight'
  })
};

// 函数2 - 传统函数声明
export function  showDefaultDebugBackground2 (light?: UI.CustomCameraLight) : void {

};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 03.导入

# 3.1 导入命名导出

使用 import { ... } from 语法导入命名导出。

// app.ts
import { PI, add, Calculator } from "./math";

console.log(PI); // 3.14
console.log(add(2, 3)); // 5
console.log(Calculator.multiply(2, 3)); // 6
1
2
3
4
5
6

# 3.2 导入默认导出

使用 import ... from 语法导入默认导出。

// app.ts
import log from "./logger";
// 导入外部模块
import {Logger} from "./utils/logger";           // 命名导入
import {JsSession} from "palm";

log("Hello, TypeScript!"); // "Hello, TypeScript!"
1
2
3
4
5
6
7

# 3.3 导入所有内容

使用 import * as 语法导入模块的所有内容。

// app.ts
import * as math from "./math";

console.log(math.PI); // 3.14
console.log(math.add(2, 3)); // 5
1
2
3
4
5

# 04.模块解析

TypeScript 支持两种模块解析策略:

  • Classic:TypeScript 的旧版解析策略。
  • Node:与 Node.js 的模块解析策略兼容(默认)。

# 4.1 相对路径导入

import { add } from "./math"; // 导入当前目录下的 math.ts
1

# 4.2 非相对路径导入

import { log } from "logger"; // 导入 node_modules 中的 logger 模块
1

这个ts文件,依赖了palm_constants.ts,后面可能依赖多个ts文件。我在编译时,如何打成一个js。

1.存放到dist目录下。 2.要求不要改变原ts文件。 3.不要创建合并ts文件。 4.建议给出直接编译的方案。

# 05.模块的编译

TypeScript 模块可以编译为不同的模块系统(如 CommonJS、AMD、ES Modules 等),通过 tsconfig.json 中的 module 选项配置。

{
    "compilerOptions": {
        "module": "CommonJS" // 编译为 CommonJS 模块
    }
}
1
2
3
4
5

# 06.模块与命名空间

在大型项目中,不同模块可能使用相同的变量名或函数名。命名空间可以将这些代码隔离,避免冲突。

# 6.1 命名空间

命名空间是 TypeScript 早期用于组织代码的方式,现在推荐使用模块。

namespace MathUtils {
    export function add(x: number, y: number): number {
        return x + y;
    }
}

console.log(MathUtils.add(2, 3)); // 5
1
2
3
4
5
6
7

# 6.2 避免命名冲突

namespace MathUtils {
    export function add(a: number, b: number): number {
        return a + b;
    }
}

namespace StringUtils {
    export function add(a: string, b: string): string {
        return a + b;
    }
}

console.log(MathUtils.add(1, 2)); // 3
console.log(StringUtils.add("Hello, ", "World")); // Hello, World
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 6.3 模块与命名空间结合

可以将命名空间放在模块中,但通常不推荐。

// math.ts
export namespace MathUtils {
    export function add(x: number, y: number): number {
        return x + y;
    }
}

// app.ts
import { MathUtils } from "./math";
console.log(MathUtils.add(2, 3)); // 5
1
2
3
4
5
6
7
8
9
10

# 6.4 命名空间原理

在编译后的 JavaScript 中,命名空间会被转换为一个立即执行函数(IIFE),形成一个闭包,避免污染全局作用域。

// TypeScript
namespace MathUtils {
    export function add(a: number, b: number): number {
        return a + b;
    }
}

// 编译后的 JavaScript
var MathUtils;
(function (MathUtils) {
    function add(a, b) {
        return a + b;
    }
    MathUtils.add = add;
})(MathUtils || (MathUtils = {}));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 6.5 模块VS命名空间

命名空间与模块的区别

特性 命名空间 模块
作用 组织代码,避免命名冲突 组织代码,支持模块化开发
文件作用域 默认全局,需手动隔离 默认隔离,需显式导出和导入
依赖管理 不支持自动依赖管理 支持自动依赖管理(如 import/export)
适用场景 小型项目或旧代码迁移 大型项目或现代开发

# 6.6 最佳实践建议

1.避免过度使用

在现代 TypeScript 开发中,推荐使用模块(import/export)代替命名空间,因为模块更符合现代 JavaScript 的模块化标准。

2.与模块结合

如果需要兼容旧代码,可以将命名空间与模块结合使用。

// mathUtils.ts
export namespace MathUtils {
    export function add(a: number, b: number): number {
        return a + b;
    }
}

// main.ts
import { MathUtils } from "./mathUtils";
console.log(MathUtils.add(1, 2)); // 3
1
2
3
4
5
6
7
8
9
10

# 07.动态导入

使用 import() 动态加载模块,返回一个 Promise。

async function loadModule() {
    const math = await import("./math");
    console.log(math.add(2, 3)); // 5
}

loadModule();
1
2
3
4
5
6

# 08.模块类型声明

# 8.1 声明模块

为第三方模块添加类型声明。

// my-module.d.ts
declare module "my-module" {
    export function doSomething(): void;
}
1
2
3
4

# 8.2 导入类型

可以单独导入类型。

import type { Person } from "./types";
1

# 8.3 模块最佳实践

  • 使用 ES 模块语法(import/export)。
  • 避免使用命名空间,优先使用模块。
  • 将类型定义放在单独的文件中(如 types.ts)。
  • 使用动态导入优化性能。
上次更新: 2026/06/10, 11:13:41
高级类型
实用工具

← 高级类型 实用工具→

最近更新
01
信号崩溃快速排查
06-15
02
CoreDump破案
06-15
03
perf火焰图实战
06-15
更多文章>
Theme by Vdoing | Copyright © 2019-2026 杨充 | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式