基本用法
namespace 用来建立一个容器,内部的所有变量和函数,都必须在这个容器里面使用。
namespace Utils {
function isString(value:any) {
return typeof value === 'string';
}
// 正确
isString('yes');
}
Utils.isString('no'); // 报错
上面示例中,命名空间Utils
里面定义了一个函数isString()
,它只能在Utils
里面使用,如果用于外部就会报错。
如果要在命名空间以外使用内部成员,就必须为该成员加上export
前缀,表示对外输出该成员。
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!');
上面示例中,只要加上export
前缀,就可以在命名空间外部使用内部成员。
编译出来的 JavaScript 代码如下。
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 会变成一个值,保留在编译后的代码中。这一点要小心,它不是纯的类型代码。
namespace 内部还可以使用import
命令输入外部成员,相当于为外部成员起别名。当外部成员的名字比较长时,别名能够简化代码。
namespace Utils {
export function isString(value:any) {
return typeof value === 'string';
}
}
namespace App {
import isString = Utils.isString;
isString('yes');
// 等同于
Utils.isString('yes');
}
上面示例中,import
命令指定在命名空间App
里面,外部成员Utils.isString
的别名为isString
。
import
命令也可以在 namespace 外部,指定别名。
namespace Shapes {
export namespace Polygons {
export class Triangle {}
export class Square {}
}
}
import polygons = Shapes.Polygons;
// 等同于 new Shapes.Polygons.Square()
let sq = new polygons.Square();
上面示例中,import
命令在命名空间Shapes
的外部,指定Shapes.Polygons
的别名为polygons
。
namespace 可以嵌套。
namespace Utils {
export namespace Messaging {
export function log(msg:string) {
console.log(msg);
}
}
}
Utils.Messaging.log('hello') // "hello"
上面示例中,命名空间Utils
内部还有一个命名空间Messaging
。注意,如果要在外部使用Messaging
,必须在它前面加上export
命令。
网友评论