TypeScript namespace
TypeScript namespace
namespace 是一种将相关代码组织在一起的方式,中文译为 “ 命名空间 “。
它出现在 ES 模块诞生之前,作为 TypeScript 自己的模块格式而发明的。但是,自从有了 ES 模块,官方已经不推荐使用 namespace 了。
namespace 用来建立一个容器,内部的所有变量和函数,都必须在这个容器里面使用:
1
2
3
4
5
6
7
8
9
10
namespace Utils {
function isString(value:any) {
return typeof value === 'string';
}
// 正确
isString('yes');
}
Utils.isString('no'); // 报错
命名空间 Utils 里面定义了一个函数 isString(),它只能在 Utils 里面使用,如果用于外部就会报错。
如果要在命名空间以外使用内部成员,就必须为该成员加上 export 前缀,表示对外输出该成员。
1
2
3
4
5
6
7
8
9
10
11
namespace Utility {
export function log(msg:string) {
console.log(msg);
}
export function error(msg:string) {
console.error(msg);
}
}
Utility.log('Call me');
Utility.error('maybe!');
编译出来的 JavaScript 代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
var Utility;
(function (Utility) {
function log(msg) {
console.log(msg);
}
Utility.log = log;
function error(msg) {
console.error(msg);
}
Utility.error = error;
})(Utility || (Utility = {}));
命名空间 Utility 变成了 JavaScript 的一个对象,凡是 export 的内部成员,都成了该对象的属性。 这就是说,namespace 会变成一个值,保留在编译后的代码中。这一点要小心,它不是纯的类型代码。
本文由作者按照 CC BY 4.0 进行授权