feng xiaohan

命名空间(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;
}

合并规则包括将同名接口、类和函数合并为一个接口、类或函数,并将同名变量合并为一个变量。