TypeScript学习笔记(七):模块

JavaScript中的模块

在学习TypeScript的模块之前我们先看看在JavaScript中的模块是如何实现的。

模块的好处

首先我们要了解使用模块的好处都有什么?

  1. 模块化、可重用;
  2. 封装变量与函数;

下面的示例为使用JavaScript实现的模块:

 1 var MyModule = function(name)
 2 {
 3     //这里定义的都是私有的成员
 4     var myName = name;
 5     var age = 25;
 6
 7     //这里返回一个对象, 使用 JS 的闭包实现类的效果
 8     return {
 9         //这里都是公开的成员
10         show:function()
11         {
12             alert(myName + ":" + age);
13         }
14     };
15 }
16
17 //创建一个实例
18 var obj = new MyModule("LiLei");
19 obj.show();

TypeScript中的模块

在TypeScript中,定义模块使用关键字module,通过模块我们可以更加有效的组织代码。比如当我们的项目越来越大时,我们把所有的类都暴露在全局命名空间下,难免会出现同名等冲突的情况,当我们使用模块后可以解决这个问题。

 1 module Validation
 2 {
 3     export interface StringValidator
 4     {
 5         isAcceptable(s: string): boolean;
 6     }
 7
 8     var lettersRegexp = /^[A-Za-z]+$/;
 9     var numberRegexp = /^[0-9]+$/;
10
11     export class LettersOnlyValidator implements StringValidator
12     {
13         isAcceptable(s: string)
14         {
15             return lettersRegexp.test(s);
16         }
17     }
18
19     export class ZipCodeValidator implements StringValidator
20     {
21         isAcceptable(s: string)
22         {
23             return s.length === 5 && numberRegexp.test(s);
24         }
25     }
26 }
27
28 function run()
29 {
30     // Some samples to try
31     var strings = [‘Hello‘, ‘98052‘, ‘101‘];
32     // Validators to use
33     var validators: { [s: string]: Validation.StringValidator; } = {};
34     validators[‘ZIP code‘] = new Validation.ZipCodeValidator();
35     validators[‘Letters only‘] = new Validation.LettersOnlyValidator();
36     // Show whether each string passed each validator
37     strings.forEach(s =>
38     {
39         for (var name in validators)
40         {
41             console.log(‘"‘ + s + ‘" ‘ + (validators[name].isAcceptable(s) ? ‘ matches ‘ : ‘ does not match ‘) + name);
42         }
43     });
44 }
45
46 run();

使用模块要注意下面几点:

  1. 使用module包含的代码被存放到指定名称的命名空间中;
  2. 模块中需要外部访问的接口和类都需要添加关键字export;
  3. 外部要使用和访问模块中的类或接口必须将命名空间也写上;

我们看看对应的js文件:

 1 var Validation;
 2 (function (Validation) {
 3     var lettersRegexp = /^[A-Za-z]+$/;
 4     var numberRegexp = /^[0-9]+$/;
 5     var LettersOnlyValidator = (function () {
 6         function LettersOnlyValidator() {
 7         }
 8         LettersOnlyValidator.prototype.isAcceptable = function (s) {
 9             return lettersRegexp.test(s);
10         };
11         return LettersOnlyValidator;
12     })();
13     Validation.LettersOnlyValidator = LettersOnlyValidator;
14     var ZipCodeValidator = (function () {
15         function ZipCodeValidator() {
16         }
17         ZipCodeValidator.prototype.isAcceptable = function (s) {
18             return s.length === 5 && numberRegexp.test(s);
19         };
20         return ZipCodeValidator;
21     })();
22     Validation.ZipCodeValidator = ZipCodeValidator;
23 })(Validation || (Validation = {}));
24 function run() {
25     // Some samples to try
26     var strings = [‘Hello‘, ‘98052‘, ‘101‘];
27     // Validators to use
28     var validators = {};
29     validators[‘ZIP code‘] = new Validation.ZipCodeValidator();
30     validators[‘Letters only‘] = new Validation.LettersOnlyValidator();
31     // Show whether each string passed each validator
32     strings.forEach(function (s) {
33         for (var name in validators) {
34             console.log(‘"‘ + s + ‘" ‘ + (validators[name].isAcceptable(s) ? ‘ matches ‘ : ‘ does not match ‘) + name);
35         }
36     });
37 }
38 run();
39 //# sourceMappingURL=app.js.map

当然TypeScript的模块还有其它的用法,可以参考:http://www.typescriptlang.org/Handbook#modules

时间: 2024-08-25 08:37:56

TypeScript学习笔记(七):模块的相关文章

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

第十七篇:博采众长--初探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中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素. 迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来自于哪里和将要前往哪里.闭包提供的机制可以很容易实现这个任务.记住:闭包是一个内部函数,它可以访问一个或者多个外部函数的外部局部变量.每次闭包的成功调用后这些外部局部变量都保存他们的值(状态).当然如果要创建一个闭包必须要创建其外部局部变量.所以一个典型的闭包的结构包含

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

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

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

Python学习笔记—itertools模块

这篇是看wklken的<Python进阶-Itertools模块小结> 学习itertools模块的学习笔记 在看itertools中各函数的源代码时,刚开始还比较轻松,但后面看起来就比较费劲... 1.itertools.count(start=0,step=1) 此函数用来创建一个迭代器,生成从n开始的连续整数,如果忽略n,则从0开始计算 如果超出了sys.maxint,计数器将溢出并继续行-sys.maxint-1开始计算 定义: def count(start=0, step=1):