TypeScript的命名空间

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

同java的包、.net的命名空间一样,Typescript的命名空间可以将代码包裹起来,只对外暴露需要在外部访问的对象。命名空间内的对象通过export

命名空间和模块的区别:

命名空间:内部模块,主要用户组织代码,避免命名冲突。

模块:ts的外部模块的简称,侧重代码的复用,一个模块里可能会有多个命名空间。

命名空间定义

使用namespace将类和方法封装成私有的,外部想要调用的类通过export暴露出来;

不同命名空间内的类可以重名,不会导致冲突;

外部调用时需要加上namespace;

  1. namespace A {
  2. interface Animal {
  3. name:string;
  4. eat():void;
  5. }
  6. // 命名空间内的类和方法是私有的,外部用的话需要加export暴露出来
  7. export class Dog implements Animal {
  8. name:string;
  9. constructor(name:string) {
  10. this.name=name;
  11. }
  12. eat():void {
  13. console.log(`${this.name} 吃狗粮.`);
  14. }
  15. }
  16. export class Cat implements Animal {
  17. name:string;
  18. constructor(name:string) {
  19. this.name = name;
  20. }
  21. eat():void {
  22. console.log(`${this.name} 吃猫粮.`);
  23. }
  24. }
  25. }
  26. namespace B {
  27. interface Animal {
  28. name:string;
  29. eat():void;
  30. }
  31. // 命名空间内的类和方法是私有的,外部用的话需要加export暴露出来
  32. export class Dog implements Animal {
  33. name:string;
  34. constructor(name:string) {
  35. this.name=name;
  36. }
  37. eat():void {
  38. console.log(`${this.name} 吃狗粮.`);
  39. }
  40. }
  41. export class Cat implements Animal {
  42. name:string;
  43. constructor(name:string) {
  44. this.name = name;
  45. }
  46. eat():void {
  47. console.log(`${this.name} 吃猫粮.`);
  48. }
  49. }
  50. }
  51. // 外部通过 命名空间.暴露的类 进行调用
  52. let a = new A.Dog('阿黄');
  53. a.eat();
  54. let b = new B.Cat('小花');
  55. b.eat();

命名空间模块化

  1. 编写命名空间的模块:./modules/animal.ts

    1. // 使用export,将模块内的命名空间暴露出来
    2. export namespace A {
    3. interface Animal {
    4. name:string;
    5. eat():void;
    6. }
    7. export class Dog implements Animal {
    8. name:string;
    9. constructor(name:string) {
    10. this.name=name;
    11. }
    12. eat():void {
    13. console.log(`${this.name} 吃狗粮.`);
    14. }
    15. }
    16. }
    17. export namespace B {
    18. interface Animal {
    19. name:string;
    20. eat():void;
    21. }
    22. export class Dog implements Animal {
    23. name:string;
    24. constructor(name:string) {
    25. this.name=name;
    26. }
    27. eat():void {
    28. console.log(`${this.name} 吃狗粮.`);
    29. }
    30. }
    31. }
  1. 编写引入ts ```typescript import {A,B} from ‘./modules/animal’

// 外部通过 命名空间.暴露的类 进行调用 let a = new A.Dog(‘阿黄’); a.eat();

let b = new B.Cat(‘小花’); b.eat();

  1. <a name="249fa55f"></a>
  2. ## 命名空间分离到多文件
  3. 将Validation命名空间分割成多个文件,尽管是不同的文件,它们仍是同一个命名空间,并且在使用的时候就如同它们在一个文件中定义一样。因为不同文件之间存在依赖关系,所以我们加入了引用标签来告诉编译器文件之间的关联。
  4. Validation.js
  5. ```typescript
  6. namespace Validation {
  7. export interface StringValidator {
  8. isAcceptable(s: string): boolean;
  9. }
  10. }

LettersOnlyValidator.ts

  1. /// <reference path="Validation.ts" />
  2. namespace Validation {
  3. const lettersRegexp = /^[A-Za-z]+$/;
  4. export class LettersOnlyValidator implements StringValidator {
  5. isAcceptable(s: string) {
  6. return lettersRegexp.test(s);
  7. }
  8. }
  9. }

ZipCodeValidator.ts

  1. /// <reference path="Validation.ts" />
  2. namespace Validation {
  3. const numberRegexp = /^[0-9]+$/;
  4. export class ZipCodeValidator implements StringValidator {
  5. isAcceptable(s: string) {
  6. return s.length === 5 && numberRegexp.test(s);
  7. }
  8. }
  9. }

测试:

  1. /// <reference path="Validation.ts" />
  2. /// <reference path="LettersOnlyValidator.ts" />
  3. /// <reference path="ZipCodeValidator.ts" />
  4. // Some samples to try
  5. let strings = ["Hello", "98052", "101"];
  6. // Validators to use
  7. let validators: { [s: string]: Validation.StringValidator; } = {};
  8. validators["ZIP code"] = new Validation.ZipCodeValidator();
  9. validators["Letters only"] = new Validation.LettersOnlyValidator();
  10. // Show whether each string passed each validator
  11. for (let s of strings) {
  12. for (let name in validators) {
  13. console.log(`"${ s }" - ${ validators[name].isAcceptable(s) ? "matches" : "does not match" } ${ name }`);
  14. }
  15. }

别名

使用import q = x.y.z给对象起一个短名字

  1. namespace Shapes {
  2. export namespace Polygons {
  3. export class Triangle { }
  4. export class Square { }
  5. }
  6. }
  7. import polygons = Shapes.Polygons;
  8. let sq = new polygons.Square(); // Same as "new Shapes.Polygons.Square()"