TypeScript学习笔记(七) - 命名空间

本篇将介绍TypeScript的命名空间,并简单说明一下与模块的区别。

在之前的例子里,有如下一段代码,通过修改这段代码来演示命名空间的用法。

 1 interface Animal {
 2     name: string;
 3     eat(): void;
 4 }
 5
 6 class Dog implements Animal {
 7     name: string;
 8     constructor(theName: string) {
 9         this.name = theName;
10     }
11
12     eat() {
13         console.log(`${this.name} 吃狗粮。`);
14     }
15 }
16
17 class Cat implements Animal {
18     name: string;
19     constructor(theName: string) {
20         this.name = theName;
21     }
22
23     eat() {
24         console.log(`${this.name} 吃猫粮。`);
25     }
26 }

一、命名空间的声明

同Java的包、.Net的命名空间一样,TypeScript的命名空间可以将代码包裹起来,只对外暴露需要在外部访问的对象。命名空间内的对象通过export关键字对外暴露。

将上面的例子进行修改

 1 namespace Biology {
 2     export interface Animal {
 3         name: string;
 4         eat(): void;
 5     }
 6
 7     export class Dog implements Animal {
 8         name: string;
 9         constructor(theName: string) {
10             this.name = theName;
11         }
12
13         eat() {
14             console.log(`${this.name} 吃狗粮。`);
15         }
16     }
17
18     export class Cat implements Animal {
19         name: string;
20         constructor(theName: string) {
21             this.name = theName;
22         }
23
24         eat() {
25             console.log(`${this.name} 吃猫粮。`);
26         }
27     }
28 }
29
30
31 let dog: Biology.Animal;
32 dog = new Biology.Dog(‘狗狗‘);
33 dog.eat();

通过namespace关键字声明命名空间,通过export导出需要在外部使用的对象。在命名空间外部需要通过“完全限定名”访问这些对象。

二、命名空间的引用

通常情况下,声明的命名空间代码和调用的代码不在同一个文件里

biology.ts

 1 namespace Biology {
 2     export interface Animal {
 3         name: string;
 4         eat(): void;
 5     }
 6
 7     export class Dog implements Animal {
 8         name: string;
 9         constructor(theName: string) {
10             this.name = theName;
11         }
12
13         eat() {
14             console.log(`${this.name} 吃狗粮。`);
15         }
16     }
17
18     export class Cat implements Animal {
19         name: string;
20         constructor(theName: string) {
21             this.name = theName;
22         }
23
24         eat() {
25             console.log(`${this.name} 吃猫粮。`);
26         }
27     }
28 }

biology.ts

app.ts

1 /// <reference path="biology.ts" />
2
3 let dog: Biology.Animal;
4 dog = new Biology.Dog(‘狗狗‘);
5 dog.eat();

通过reference注释引用命名空间,即可通过“完全限定名”进行访问。

更有甚者,相同的命名空间会声明在不同的文件中

1 namespace Biology {
2     export interface Animal {
3         name: string;
4         eat(): void;
5     }
6 }

biology.ts

 1 /// <reference path="biology.ts" />
 2
 3 namespace Biology {
 4     export class Dog implements Animal {
 5         name: string;
 6         constructor(theName: string) {
 7             this.name = theName;
 8         }
 9
10         eat() {
11             console.log(`${this.name} 吃狗粮。`);
12         }
13     }
14 }

dog.ts

 1 /// <reference path="biology.ts" />
 2
 3 namespace Biology {
 4     export class Cat implements Animal {
 5         name: string;
 6         constructor(theName: string) {
 7             this.name = theName;
 8         }
 9
10         eat() {
11             console.log(`${this.name} 吃猫粮。`);
12         }
13     }
14 }

cat.ts

 1 // app.ts
 2
 3 /// <reference path="biology.ts" />
 4 /// <reference path="cat.ts" />
 5 /// <reference path="dog.ts" />
 6
 7
 8 let dog: Biology.Animal;
 9 dog = new Biology.Dog(‘狗狗‘);
10 dog.eat();
11
12 let cat: Biology.Animal;
13 cat = new Biology.Cat(‘喵星人‘);
14 cat.eat();

编译之后,每一个文件都将编译成对应的一个JavaScript文件,使用时需要将这些文件都引用进来。通过如下命令,可以将有相同命名空间的文件编译到一个JavaScript文件中,这样在引用时只需要一个文件即可。

1 tsc --outFile js\biology.js ts\biology.ts ts\dog.ts ts\cat.ts

将biology.ts、dog.ts、cat.ts编辑到一个JavaScript文件biology.js文件内,编译后的文件内容如下

 1 /// <reference path="biology.ts" />
 2 var Biology;
 3 (function (Biology) {
 4     var Dog = (function () {
 5         function Dog(theName) {
 6             this.name = theName;
 7         }
 8         Dog.prototype.eat = function () {
 9             console.log(this.name + " \u5403\u72D7\u7CAE\u3002");
10         };
11         return Dog;
12     }());
13     Biology.Dog = Dog;
14 })(Biology || (Biology = {}));
15 /// <reference path="biology.ts" />
16 var Biology;
17 (function (Biology) {
18     var Cat = (function () {
19         function Cat(theName) {
20             this.name = theName;
21         }
22         Cat.prototype.eat = function () {
23             console.log(this.name + " \u5403\u732B\u7CAE\u3002");
24         };
25         return Cat;
26     }());
27     Biology.Cat = Cat;
28 })(Biology || (Biology = {}));

三、命名空间的别名

在引用命名空间时,可以通过import关键字起一个别名

 1 // app.ts
 2
 3 /// <reference path="biology.ts" />
 4 /// <reference path="cat.ts" />
 5 /// <reference path="dog.ts" />
 6
 7 import bio_other = Biology;     // 别名
 8
 9 let dog: bio_other.Animal;
10 dog = new bio_other.Dog(‘狗狗‘);
11 dog.eat();
12
13 let cat: bio_other.Animal;
14 cat = new bio_other.Cat(‘喵星人‘);
15 cat.eat();

四、命名空间与模块

命名空间:代码层面的归类和管理。将有相似功能的代码都归一到同一个空间下进行管理,方便其他代码引用。更多的是侧重代码的复用。

模块:一个完整功能的封装,对外提供的是一个具有完整功能的功能包,需要显式引用。一个模块里可能会有多个命名空间。

时间: 2024-10-11 06:04:27

TypeScript学习笔记(七) - 命名空间的相关文章

第十七篇:博采众长--初探WDDM驱动学习笔记(七)

基于WDDM驱动的DirectX视频加速重定向框架设计与实现 现在的研究生的论文, 真正质量高的, 少之又少, 开题开得特别大, 动不动就要搞个大课题, 从绪论开始到真正自己所做的内容之间, 是东拼西凑地抄概念, 抄公式, 达到字数篇幅的要求, 而自己正真做了什么, 有哪些实际感受, 做出的内容, 相比前面的东拼西凑就几点内容, 之后就草草结束, 步入感谢的段落. 原因不光只有学生自己, 所谓的读研, 如果没有一个环境, 学生有再大的愿望, 再强的毅力, 到头来也只是空无奈. 有些导师要写书,

马哥学习笔记七——LAMP编译安装之MYSQL

1.准备数据存放的文件系统 新建一个逻辑卷,并将其挂载至特定目录即可.这里不再给出过程. 这里假设其逻辑卷的挂载目录为/mydata,而后需要创建/mydata/data目录做为mysql数据的存放目录. 2.新建用户以安全方式运行进程: # groupadd -r mysql # useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql # chown -R mysql:mysql /mydata/data 3.安装并初始化my

Lua学习笔记(七):迭代器与泛型for

1.迭代器与闭包 迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素.在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素. 迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来自于哪里和将要前往哪里.闭包提供的机制可以很容易实现这个任务.记住:闭包是一个内部函数,它可以访问一个或者多个外部函数的外部局部变量.每次闭包的成功调用后这些外部局部变量都保存他们的值(状态).当然如果要创建一个闭包必须要创建其外部局部变量.所以一个典型的闭包的结构包含

python学习笔记七:条件&循环语句

1.print/import更多信息 print打印多个表达式,使用逗号隔开 >>> print 'Age:',42 Age: 42   #注意个结果之间有一个空格符 import:从模块导入函数 import 模块 from 模块 import 函数 from 模块 import * 如果两个模块都有open函数的时候, 1)使用下面方法使用: module1.open()... module2.open()... 2)语句末尾增加as子句 >>> import ma

swift学习笔记(七)自动引用计数

与Object-c一样,swift使用自动引用计数来跟踪并管理应用使用的内存.当实例不再被使用时,及retainCount=0时,会自动释放是理所占用的内存空间. 注:引用计数仅适用于类的实例,因为struct和enumeration属于值类型,也就不牵涉引用,所以其存储和管理方式并不是引用计数. 当一个实例被初始化时,系统会自动分配一定的内存空间,用于管理属性和方法.当实例对象不再被使用时,其内存空间被收回. swift中的引用类型分为三种,即Strong强引用,weak弱引用和无主引用unw

Swift学习笔记七:闭包

闭包可以 捕获 和存储其所在上下文中任意常量和变量的引用. Swift 会为您管理在 捕获 过程中涉及到的内存操作. 在 函数 章节中介绍的全局和嵌套函数实际上也是特殊的闭包,闭包采取如下三种形式之一: 1. 全局函数是一个有名字但不会捕获任何值的闭包 2. 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包 3. 闭包表达式是一个可以捕获其上下文中变量或常量值的没有名字的闭包 一.闭包表达式 闭包函数类似于Objective-C中的block.下面我们用事实说话: let counts =

Linux System Programming 学习笔记(七) 线程

1. Threading is the creation and management of multiple units of execution within a single process 二进制文件是驻留在存储介质上,已被编译成操作系统可以使用,准备执行但没有正运行的休眠程序 进程是操作系统对 正在执行中的二进制文件的抽象:已加载的二进制.虚拟内存.内核资源 线程是进程内的执行单元 processes are running binaries, threads are the smal

thinkphp学习笔记8—命名空间

原文:thinkphp学习笔记8-命名空间 新版本(3.2)中采用命名空间的方式定义和加载类库文件,解决多个模块之间的冲突问题,并实现了更加高效的自动加载机制. 需要给类库定义所在的命名空间,命名空间的路径和类库文件的目录一致,就可以实现类的自动加载,例如Org\Util\File类的定义为 namespace Org\Util; class File { } 其所在的路径是ThinkPHP/Library/Org/Util/File.class.php,我们实例化该类写法如下: $class

CCNA学习笔记七——路由概述

静态路由协议: 动态路由协议:AS(自治系统):执行统一路由策略的一组设备的集合 EGP(外部网关协议): BGP:边界网关协议 IGP(内部网关协议): 距离矢量协议: RIP:V1,V2 IGRP EIGRP 链路状态路由协议: OSPF IS-IS 静态路由: 特点: 路由表是手工设置的 除非网络管理员干预,否则静态路由不会发生变化 路由表的形成不需要占用网络资源 适合环境 一般用于网络规模很小,拓扑结构固定的网络中 默认路由: 特点: 在所有路由类型中,默认路由优先级最低 适用环境: 一

[傅里叶变换及其应用学习笔记] 七. 傅里叶正(反)变换复习

这份是本人的学习笔记,课程为网易公开课上的斯坦福大学公开课:傅里叶变换及其应用. 傅里叶变换没有统一的定义 符号 傅里叶变换的符号在不同的书籍可能有不同的写法: 如正变换的符号:$\eta f(s)$,$\hat{f}(s)$,$F(s)$ 如反变换的符号:$\eta^{-1}f(t)$,$\check{f}(t)$,$f(t)$ 公式 傅里叶变换的公式也没有统一的写法: 本课程采用的是如下公式 $\eta f(s) = \displaystyle{\int_{-\infty}^{\infty}