命名空间(namespace)
使用命名空间避免全局变量造成的污染。
TS 和 ES6 一样,任何包含顶级的
import或者export的文件都被当成一个模块;相反,如果一个文件不带有顶级的import或者export声明,它的内容被视为全局可见,文件和文件之间也是可见的。// index.ts const a = 1;// index2.ts const a = 2; // 报错可以使用
export避免这种情况:// index2.ts export const a = 2;
命名空间特性
- 使用
namespace定义命名空间; - 命名空间内部的类默认是私有的,需通过
export暴露出来才能使用; - 命名空间相当于内部模块,其主要作用是组织代码,避免命名冲突;
// index2.ts
namespace B {
export const a = 2;
}
console.log(B.a); // 命名空间变量使用
// index.ts
namespace A {
export const a = 1;
}
console.log(A.a); // 命名空间变量使用
嵌套命名空间
namespace A {
export namespace C {
export const D = 5;
}
}
console.log(A.C.D);
命名空间导出和引入
导出
// index2.ts export namespace B { export const a = 2; }引入
import { B } from "./index2"; console.log(B); // { a: 2 }
命名空间别名——简化命名空间
namespace A {
export namespace C {
export const D = 5;
}
}
import AC = A.C; // 为A.C起别名
console.log(AC.D); // 5
// console.log(A.C.D) // 5
注意:ts-node 不能识别命名空间别名。
命名空间重名
如果两个命名空间具有相同的名称,则它们会自动合并。
namespace A {
export const a1 = 1;
}
namespace A {
export const a2 = 2;
}
等价于:
namespace A {
export const a1 = 1;
export const a2 = 2;
}
合并规则包括将同名接口、类和函数合并为一个接口、类或函数,并将同名变量合并为一个变量。