命名空间为你提供了一个关于使用在 JavaScript 中的普遍模式的一个方便的语法:

(function(something) {

    something.foo = 123;

})(something || something = {})

基本上 something || something = {} 允许匿名函数 function(something) {} 去添加东西到一个现存项目中something || 部分)或者创建一个新对象然后把东西添加到这个对象里面去|| something = {} 部分)。这意味着你可以拥有两个这样被执行边界分开的块:

(function(something) {

    something.foo = 123;

})(something || something = {})

    console.log(something); // {foo:123}
    
(function(something) {
    something.bar = 456;

})(something || something = {})

console.log(something); // {foo:123, bar:456}

这在 JavaScript 中很常使用,以确保东西不会泄漏到全局命名空间里。有了基于文件的模块,你不再需要担心这些,但是这个模式仍然对于一堆函数的逻辑分组非常有用。因此 TypeScript 提供了 namespace 关键字来分组它们,例如:

namespace Utility {    
    export function log(msg) {        
        console.log(msg);
    }    
    
    export function error(msg) {        
        console.error(msg);
    }
}// 使用方式Utility.log('Call me');

Utility.error('maybe!');

namespace 关键字生成了跟我们之前看到的一样的 JavaScript:

(function (Utility) {
    // 添加东西到 Utility 里
})(Utility || (Utility = {}));

一点需要注意的是命名空间可以是嵌套的,因此你可以做像是 namespace Utility.Messaging 的东西来嵌套一个 Messaging 命名空间到 Utility

对于大部分的项目来说,我们推荐使用外部模块,而对于快速演示和接入旧的 JavaScript 代码使用 namespace


上一篇:TypeScript学习笔记8:模块(转载)

下一篇:TypeScript学习笔记10:箭头函数(转载)