欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TypeScript系列学习笔记-命名空间namespace

程序员文章站 2024-01-20 09:49:52
...

简介:从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对比):

TypeScript系列学习笔记-命名空间namespace

关键字 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标签文档。