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 编译选项来设置目标模块系统:
{
"compilerOptions": {
"module": "ES6",
"target": "ES6"
}
}5. 命名空间 vs 模块
在早期版本的 TypeScript 中,命名空间(namespace)被用来组织代码,避免全局命名空间污染。然而,随着 ES6 模块的支持,推荐使用模块而不是命名空间来组织代码。命名空间现在主要用于向后兼容和内部模块化。
6. 第三方库
当使用第三方库时,通常可以通过安装相应的类型定义包来获得更好的类型支持。例如,对于 lodash 库,可以安装 @types/lodash:
npm install --save-dev @types/lodash这将确保你在使用 lodash 时可以获得完整的类型检查和智能感知支持。
7. 总结
模块化是 TypeScript 中非常重要的特性,它有助于构建大型、可维护的应用程序。通过理解如何导出和导入代码、配置模块解析以及选择适当的模块系统,你可以充分利用 TypeScript 提供的强大工具来组织和优化你的代码。