在代码量较大的情况下,为了避免各种变量命令冲突,可以将相似功能的函数、类、接口登放到命名空间内。
与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
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22