Skip to content

TypeScript 模块化

TypeScript 支持模块化编程,这使得代码可以被分割成更小、更易管理的片段,并且能够更好地组织和复用代码。通过模块化,开发者可以确保不同部分的代码不会相互干扰,同时还能方便地在多个文件之间共享功能。

1. 什么是模块?

在 TypeScript 中,一个模块就是一个文件。每个文件中的顶级声明(如变量、函数、类等)默认情况下都是该模块的私有成员,除非明确导出。模块内部的代码遵循自己的作用域规则,不会与全局命名空间冲突。

2. 导出和导入

要使模块的内容对外部可用,必须使用 export 关键字。同样地,要使用其他模块中定义的内容,需要使用 import 语句。

导出内容:

  • 命名导出:你可以选择性地导出特定的标识符。

    typescript
    // math.ts
    export function add(x: number, y: number): number {
      return x + y;
    }
    
    export function subtract(x: number, y: number): number {
      return x - y;
    }
  • 默认导出:每个模块只能有一个默认导出,通常用于主要的类或函数。

    typescript
    // greeter.ts
    export default class Greeter {
      greet(name: string) {
        return `Hello, ${name}!`;
      }
    }

导入内容:

  • 命名导入:从模块中导入特定的标识符。

    typescript
    // main.ts
    import { add, subtract } from "./math";
    
    console.log(add(5, 3)); // 输出: 8
    console.log(subtract(5, 3)); // 输出: 2
  • 默认导入:导入模块的默认导出。

    typescript
    // main.ts
    import Greeter from "./greeter";
    
    const greeter = new Greeter();
    console.log(greeter.greet("World")); // 输出: Hello, World!
  • 通配符导入:导入模块的所有导出内容。

    typescript
    // main.ts
    import * as MathOperations from "./math";
    
    console.log(MathOperations.add(5, 3)); // 输出: 8
    console.log(MathOperations.subtract(5, 3)); // 输出: 2
  • 别名导入:为导入的标识符指定别名。

    typescript
    // main.ts
    import { add as sum, subtract as minus } from "./math";
    
    console.log(sum(5, 3)); // 输出: 8
    console.log(minus(5, 3)); // 输出: 2

3. 模块解析

TypeScript 使用 Node.js 的模块解析策略来查找模块。这意味着它会先在当前目录下寻找模块文件,然后沿着父目录向上查找,直到找到模块或者到达根目录。如果找不到本地模块,则会尝试从 node_modules 文件夹中加载模块。

4. 模块系统配置

TypeScript 编译器选项允许你指定目标模块系统。常见的模块系统包括:

  • CommonJS:Node.js 默认使用的模块系统。
  • ES6 (ESM):现代 JavaScript 标准的模块系统。
  • AMD:异步模块定义,主要用于浏览器环境。
  • System:SystemJS 模块加载器。
  • UMD:通用模块定义,兼容多种模块系统。

可以在 tsconfig.json 文件中通过 module 编译选项来设置目标模块系统:

json
{
  "compilerOptions": {
    "module": "ES6",
    "target": "ES6"
  }
}

5. 命名空间 vs 模块

在早期版本的 TypeScript 中,命名空间(namespace)被用来组织代码,避免全局命名空间污染。然而,随着 ES6 模块的支持,推荐使用模块而不是命名空间来组织代码。命名空间现在主要用于向后兼容和内部模块化。

6. 第三方库

当使用第三方库时,通常可以通过安装相应的类型定义包来获得更好的类型支持。例如,对于 lodash 库,可以安装 @types/lodash

bash
npm install --save-dev @types/lodash

这将确保你在使用 lodash 时可以获得完整的类型检查和智能感知支持。

7. 总结

模块化是 TypeScript 中非常重要的特性,它有助于构建大型、可维护的应用程序。通过理解如何导出和导入代码、配置模块解析以及选择适当的模块系统,你可以充分利用 TypeScript 提供的强大工具来组织和优化你的代码。

Released under the MIT License.