简介:从ECMAScript 2015开始,JS引入了模块的概念。TS也沿用这个概念,但在TS1.5里术语名已经发生了变化。 "内部模块"现在称做"命名空间"。 "外部模块"现在则简称为"模块",这是为了与 ECMAScript 2015里的术语保持一致,(也就是说module X {}
相当于现在推荐的写法 namespace X {}
)。
注:任何使用 module
关键字来声明一个 "内部模块" 的地方都应该使用namespace
关键字来替换。
命名空间(namespace)概念:
1.类似C#中的命名空间;
2.使用 namespace 关键字申明,
3.在命名空间中默认成员都是私有 private 的;
4.在命名空间中使用 export 关键字声明公有资源;
5.命名空间支持跨文件分隔;
6.在Node.js/Require.js中使用 require 关键字导入模块;
7.可以使用 import 关键字声明命名空间的别名;
实例代码如下(TS和JS对比):
关键字 interface 声明接口、 implements 实现接口;
外部命名空间:declare namespace
流行的程序库D3在全局对象d3
里定义它的功能。 因为这个库通过一个 <script>
标签加载(不是通过模块加载器),它的声明文件使用内部模块来定义它的类型。 为了让TS编译器识别它的类型,我们使用外部命名空间声明。 比如,我们可以像下面这样写:
declare namespace D3 {
export interface Selectors {
select: {
(selector: string): Selection;
(element: EventTarget): Selection;
};
}
export interface Event {
x: number;
y: number;
}
export interface Base extends Selectors {
event: Event;
}
}
declare var d3: D3.Base;
关键字 extends 继承;
总结:TS中使用命名空间分离文件,方便维护,类似"作用域",尽管是不同的文件,它们仍是同一个命名空间,并且在使用的时候就如同它们在一个文件中定义的一样。 因为不同文件之间存在依赖关系;
注:关键字public
和 export 的区别:
相同点:1. 都是公开访问(公有,可供外部访问);
不同点:1. 修饰(作用)对象不一样, public 主要用于修饰类(class)中的成员(作用于类内部),而 export 主要修饰类(class)本身;
TS本质是JS,在html页面引用时,注意按文件顺序引入(<script type="text/javascript" src="xxx.js"></script>),浏览器是按顺序加载文件的,待文件加载完毕再解析html标签文档。