模块和命名空间
TypeScript 提供了两种主要的代码组织方式:模块(Modules)和命名空间(Namespaces)。它们都用于组织和管理代码,但有不同的用途和特性。
模块(Modules)
在 TypeScript 中,可以通过 export 关键字来导出模块中的变量、函数、类和接口。导出的元素可以在其他模块中通过 import 关键字进行导入。
每个模块都拥有自己的作用域,不会与其他模块中的变量冲突。
导出和导入
1 2 3 4 5 6 7
   |  export function add(x: number, y: number): number {     return x + y; }
 
  import { add } from './math.ts'
 
  | 
默认导出
1 2 3 4 5
   |  export default 'langpz'
 
  import name from './a'
 
  | 
默认导出可以使用 default 关键字。默认导出的项在导入时不需要使用大括号 {}。
重命名导入和导出
在导入和导出时,可以对名称进行重命名,以避免命名冲突或使名称更加语义化。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
   |  export function add(x: number, y: number): number {     return x + y; }
  export function subtract(x: number, y: number): number {     return x - y; }
  export { add as sum, subtract as difference };
 
  import { sum, difference } from './math';
  console.log(sum(5, 3));  console.log(difference(5, 3)); 
 
  | 
命名空间(Namespaces)
命名空间是 TypeScript 提供的一种将代码分组的方式,适用于将代码组织在一个全局范围内。命名空间通过 namespace 关键字定义,通常用于在一个全局作用域中定义库或框架。
使用命名空间
1 2 3 4 5 6 7 8 9 10 11 12 13
   | namespace Utils {     export function log(message: string): void {         console.log(message);     }
      export function error(message: string): void {         console.error(message);     } }
 
  Utils.log('lanpz');  Utils.error('https://blog.langpz.com'); 
  | 
命名空间嵌套使用
1 2 3 4 5 6 7 8 9 10 11 12 13
   | namespace zoo {     export class Dog {         eat() {             console.log('zoo dog');         }     }
      export namespace bear {         export const name = '熊';     } }
  console.log(zoo.bear.name); 
  | 
合并命名空间
TypeScript 允许合并同名的命名空间,这在定义复杂库或框架时非常有用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
   | namespace Library {     export function init(): void {         console.log('Library initialized');     } }
  namespace Library {     export function shutdown(): void {         console.log('Library shut down');     } }
 
  Library.init();  Library.shutdown(); 
  | 
模块(Modules) VS 命名空间(Namespaces)
| 特性 | 模块(Modules) | 命名空间(Namespaces) | 
|---|
| 作用域 | 独立作用域,避免命名冲突 | 全局作用域,可能导致命名冲突 | 
| 依赖管理 | 通过导入和导出管理模块依赖 | 无法管理依赖,全部在全局可见 | 
| 代码重用 | 易于在不同项目中重用 | 重用性较差,需要手动包含文件 | 
| 动态加载 | 支持动态加载,提高性能 | 不支持动态加载,不适用于大型应用 | 
| 兼容性 | 与 ECMAScript 标准兼容 | 非 ECMAScript 标准,现代项目不推荐使用 | 
| 学习曲线 | 较为复杂,需要学习和配置 | 简单易用,适合快速开发 | 
| 适用场景 | 适用于大型项目和现代应用 | 适用于小型项目和库开发 |