模块

全局模块

  • 在默认情况下,当你开始在一个新的 TypeScript 文件中写下代码时,它处于全局命名空间中
  • 使用全局变量空间是危险的,因为它会与文件内的代码命名冲突。我们推荐使用下文中将要提到的文件模块

    文件模块

  • 文件模块也被称为外部模块。如果在你的 TypeScript 文件的根级别位置含有 import 或者 export,那么它会在这个文件中创建一个本地的作用域

  • 模块是TS中外部模块的简称,侧重于代码和复用
  • 模块在期自身的作用域里执行,而不是在全局作用域里
  • 一个模块里的变量、函数、类等在外部是不可见的,除非你把它导出
  • 如果想要使用一个模块里导出的变量,则需要导入

    1. // a.ts
    2. export const a = 1;
    1. // index.ts
    2. import { a } from './a';
    3. console.log(a);

    模块规范

  • AMD:不要使用它,它仅能在浏览器工作;

  • SystemJS:这是一个好的实验,已经被 ES 模块替代;
  • ES 模块:它并没有准备好。
  • 使用 module: commonjs 选项来替代这些模式,将会是一个好的主意

    命名空间

  • 在代码量较大的情况下,为了避免命名空间冲突,可以将相似的函数、类、接口放置到命名空间内

  • 命名空间可以将代码包裹起来,只对外暴露需要在外部访问的对象,命名空间内通过export向外导出
  • 命名空间是内部模块,主要用于组织代码,避免命名冲突
    1. namespace A {
    2. const a = 1;
    3. }
    4. // Property 'a' does not exist on type 'typeof A'.
    5. // console.log(A.a)
    需要导出
    1. namespace A {
    2. export const a = 1;
    3. }
    4. console.log(A.a);
    可以在一个文件中写多个同名变量
    1. namespace A {
    2. export const a = 1;
    3. }
    4. namespace B {
    5. export const a = 1;
    6. }
    7. console.log(A.a, B.a)
    其实一个命名空间本质上一个对象,它的作用是将一系列相关的全局变量组织到一个对象的属性
    1. var A;
    2. (function (A) {
    3. A.a = 1;
    4. })(A || (A = {}));
    5. var B;
    6. (function (B) {
    7. B.a = 1;
    8. })(B || (B = {}));
    9. console.log(A.a, B.a);
    同名命名空间会合并到一起: ```typescript namespace A { export const name = ‘f’; } namespace A { export const age = 18; }

console.log(A.name, A.age); // ‘f’ 18

  1. 不同模块下的命名空间不会合并:
  2. ```typescript
  3. module A {
  4. export namespace T {
  5. export const name = 'f';
  6. }
  7. }
  8. module B {
  9. export namespace U {
  10. export const name = 'f';
  11. }
  12. }
  13. console.log(A.T.name, B.U.name); // 'f' 'f'

文件、模块与命名空间

namespace在全局具有唯一性