TypeScript 中的命名空间

命名空间

在代码量较大的情况下,为了避免各种变量命名相冲突,可将相似功能的函数、类、接口等放置到命名空间内。
同 Java 的包、.Net 的命名空间一样,TypeScript 的命名空间可以将代码包裹起来,只对外暴露需要在外部访问的对象。命名空间内的对象通过 export 关键字对外暴露。

命名空间和模块的区别

名称特征
命名空间内部模块,主要用于组织代码,避免命名冲突。
模块ts 的外部模块的简称,侧重代码的复用,一个模块里可能会有多个命名空间。

示例代码如下:

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
namespace A {
interface Animal {
name: string;
eat(): void;
}
export class Dog implements Animal {
name: string;
constructor(theName: string) {
this.name = theName;
}

eat() {
console.log(`${this.name} 在吃狗粮。`);
}
}

export class Cat implements Animal {
name: string;
constructor(theName: string) {
this.name = theName;
}

eat() {
console.log(`${this.name} 吃猫粮。`);
}
}
}

namespace B {
interface Animal {
name: string;
eat(): void;
}
export class Dog implements Animal {
name: string;
constructor(theName: string) {
this.name = theName;
}

eat() {
console.log(`${this.name} 在吃狗粮。`);
}
}

export class Cat implements Animal {
name: string;
constructor(theName: string) {
this.name = theName;
}

eat() {
console.log(`${this.name} 在吃猫粮。`);
}
}
}

var c = new B.Cat("小花");

c.eat();
1
2
3
4
5
6
7
import { A, B } from "./modules/index";

var d = new A.Dog("小黑");
d.eat();

var dog = new B.Dog("小花");
dog.eat();