导入
命名空间
共享代码是一种良好的实践。它让你只需编写和测试一次,就能在多个项目中复用和扩展代码。TypeScript 使用模块、命名空间以及定义文件来实现代码共享。
命名空间:逐渐被淘汰的概念
TypeScript 中命名空间的概念正在逐渐淡出,取而代之的是更强大、更高效的代码共享方式——模块。命名空间本质上是一个被分配到全局作用域中的基本对象。该对象以命名空间的名称命名,并包含在其中定义的所有函数。
1namespace myNamespace { 2 // 代码在此处 3} 4 5// 通过 myNamespace. 来访问
使用命名空间的目标
TypeScript 允许将命名空间中的代码分布在多个文件中。使用命名空间的主要目的是将代码组织成逻辑类别,减少命名冲突,因为唯一性仅在单个命名空间内部有效。以下示例展示了 namespace1 被定义了两次。这些代码可能位于不同的物理位置。但这段代码无法正常运行。原因是,尽管它们属于同一个命名空间,要访问其中的变量,需要特殊的标识方式,这一点我们稍后会看到。
注意:以下代码会抛出错误
1namespace namespace1 { 2 let variable_ns1: number = 1; 3} 4 5namespace namespace1 { 6 let variable_ns1_also: number = 2; 7 console.log(variable_ns1); 8}
命名空间可以包含接口、类、类型、函数和变量。关键字 export 用于允许外部访问命名空间内的元素。若不使用 export,则该元素仅在命名空间内部可用。需要注意的是,未导出的元素只在其所在的命名空间代码块内可见,即使在同一命名空间的其他代码块中也不可直接访问。
1namespace namespace1 { 2 export let variable_ns1: number = 1; 3} 4 5namespace namespace1 { 6 export let variable_ns1_also: number = 2; 7} 8 9namespace namespace2 { 10 export let variable_ns2: number = 3; 11} 12 13console.log(namespace1.variable_ns1); 14console.log(namespace1.variable_ns1_also); 15console.log(namespace2.variable_ns2);
解决这一问题的方法是采用 模块 的概念,这将在下一课中详细介绍。
命名空间的问题
命名空间的问题在于,随着应用程序规模的增长,全局作用域也会不断膨胀。此外,它无法支持代码的外部分发或动态加载特定代码区域。一个有效的解决方案是采用 模块 的概念,这将在下一课中详细介绍。