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

与java中的命名空间一样,ts中的命名空间可以将代码包裹起来,只对外暴露需要在外部访问的对象。

命名空间和模块的区别:

  • 命名空间:又称为内部模块,主要用于组织代码,避免命名冲突。
  • 模块:ts的外部模块的简称,侧重代码的复用,一个模块里可能会有多个命名空间。
namespace A {
    // 命名空间内部的类和方法是封闭的
    interface Animal {
        name:string;
        eat(str:string):string;
    }
    // 实现接口
    // 要在外部使用需要export暴露
    export class Dog implements Animal {
        name:string;
        constructor(name:string) {
            this.name = name;
        }
        eat():string {
            return `${this.name}吃大骨头`;
        }
    }

    export class Cat implements Animal {
        name:string;
        constructor(name:string) {
            this.name = name;
        }
        eat(food:string):string {
            return `${this.name}${food}`;
        }
    }

    // let cat = new Cats('xiaohua');
    // console.log(cat.eats('黄花鱼')); // xiaohua吃黄花鱼
}

let dogs = new A.Dog('xiaohuang');
console.log(dogs.eat());
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
namespace shuaiGe {
    export class Dehua {
        public name:string = '刘德华'
        talk() {
            console.log('我是帅哥刘德华')
        }
    }
}

namespace bajie {
    export class Dehua {
        public name:string = '马德华'
        talk() {
            console.log('我是二师兄马德华')
        }
    }
}

let dehua1:shuaiGe.Dehua = new shuaiGe.Dehua()
let dehua2:bajie.Dehua = new bajie.Dehua()
dehua1.talk(); // 我是帅哥刘德华
dehua2.talk(); // 我是二师兄马德华
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22