由微软推出的TypeScript自从一推出就广受关注,现在无论开发前端React/Vue,还是后端API,很多项目中都广泛接受了TypeScript。下面介绍TS中命名空间的使用。

命名空间
为什么需要命名空间?其主要目的就是解决名称冲突。比如,在一个TS文件中声明了类Dog,然后在第二个TS文件中又声明了一个类Dog,那么,当使用new Dog()创建Dog类实例的时候,究竟是想用哪一个类呢?这就出现了二义性。因此,namespace就诞生了。通过namespace,可以完美的解决这个问题。这和Java中的package作用一样。同时,namespace也能有效的组织代码,把相关类放在同一个namespace中,便于管理和维护。
看一下这个例子:
namespace m06 {
export class Dog {
speak() {
console.log("Woaf Woaf");
}
}
}
const d = new m06.Dog();
d.speak();
如果使用tsc把上面TS代码编译成JS代码,就可以看到其实所谓命名空间,就是把其中的类/函数定义在另一个函数内部了:
var m06;
(function (m06) {
var Dog = /** @class */ (function () {
function Dog() {
}
Dog.prototype.speak = function () {
console.log("Woaf Woaf");
};
return Dog;
}());
m06.Dog = Dog;
})(m06 || (m06 = {}));
var d = new m06.Dog();
d.speak();
这里需要注意的是,命名空间里的类一定要暴露,否则外面无法访问。
命名空间的嵌套
命名空间是可以嵌套的,比如:
namespace m06 {
export namespace m061 {
export class Dog {
speak() {
console.log("Woaf Woaf");
}
}
}
}
const d = new m06.m061.Dog();
d.speak();