TypeScript 命名空间

上传人:豆浆 文档编号:2051426 上传时间:2017-07-19 格式:PDF 页数:6 大小:146.21KB
返回 下载 相关 举报
TypeScript 命名空间_第1页
第1页 / 共6页
TypeScript 命名空间_第2页
第2页 / 共6页
TypeScript 命名空间_第3页
第3页 / 共6页
TypeScript 命名空间_第4页
第4页 / 共6页
TypeScript 命名空间_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《TypeScript 命名空间》由会员分享,可在线阅读,更多相关《TypeScript 命名空间(6页珍藏版)》请在金锄头文库上搜索。

1、TypeScript 命名空间TypeScript命名空间关于术语的点说明: 请务必注意点,TypeScript 1.5术语名已经发了变化。 “内部模块”现在称做“命名空间”。 “外部模块”现在则简称为“模块”,这是为了与 ECMAScript 2015的术语保持致,(也就是说module X 相当于现在推荐的写法 namespace X )。介绍这篇章描述了如何在TypeScript使命名空间(之前叫做“内部模块”)来组织你的代码。就像我们在术语说明提到的那样,“内部模块”现在叫做“命名空间”。另外,任何使module关键字来声明个内部模块的地都应该使namespace关键字来替换。这就避免

2、了让新的使者被相似的名称所迷惑。第步我们先来写段程序并将在整篇章中都使这个例。 我们定义个简单的字符串验证器,假设你会使它们来验证表单的户输或验证外部数据。所有的验证器都放在个件interface StringValidator isAcceptable(s: string): boolean;let lettersRegexp = /A-Za-z+$/;let numberRegexp = /0-9+$/;class LettersOnlyValidator implements StringValidator isAcceptable(s: string) return lettersRe

3、gexp.test(s);class ZipCodeValidator implements StringValidator isAcceptable(s: string) return s.length = 5 & numberRegexp.test(s);/ Some samples to trylet strings = Hello, 98052, 101;/ Validators to uselet validators: s: string: StringValidator; = ;validatorsZIP code = new ZipCodeValidator();validat

4、orsLetters only = new LettersOnlyValidator();/ Show whether each string passed each validatorstrings.forEach(s = for (let name in validators) console.log( + s + + (validatorsname.isAcceptable(s) ? );命名空间随着更多验证器的加,我们需要种段来组织代码,以便于在记录它们类型的同时还不担与其它对象产命名冲突。 因此,我们把验证器包裹到个命名空间内,不是把它们放在全局命名空间下。下的例,把所有与验证器相关

5、的类型都放到个叫做Validation的命名空间。 因为我们想让这些接和类在命名空间之外也是可访问的,所以需要使 export。 相反的,变量 lettersRegexp和numberRegexp是实现的细节,不需要导出,因此它们在命名空间外是不能访问的。 在件末尾的测试代码,由于是在命名空间之外访问,因此需要限定类型的名称,如 Validation.LettersOnlyValidator。使命名空间的验证器namespace Validation export interface StringValidator isAcceptable(s: string): boolean;const

6、lettersRegexp = /A-Za-z+$/;const numberRegexp = /0-9+$/;export class LettersOnlyValidator implements StringValidator isAcceptable(s: string) return lettersRegexp.test(s);export class ZipCodeValidator implements StringValidator isAcceptable(s: string) return s.length = 5 & numberRegexp.test(s);/ Some

7、 samples to trylet strings = Hello, 98052, 101;/ Validators to uselet validators: s: string: Validation.StringValidator; = ;validatorsZIP code = new Validation.ZipCodeValidator();validatorsLetters only = new Validation.LettersOnlyValidator();/ Show whether each string passed each validatorstrings.fo

8、rEach(s = for (let name in validators) console.log($ s - $ validatorsname.isAcceptable(s) ? matches : does not match );分离到多件当应变得越来越时,我们需要将代码分离到不同的件中以便于维护。多件中的命名空间现在,我们把Validation命名空间分割成多个件。 尽管是不同的件,它们仍是同个命名空间,并且在使的时候就如同它们在个件中定义的样。 因为不同件之间存在依赖关系,所以我们加了引标签来告诉编译器件之间的关联。 我们的测试代码保持不变。Validation.tsnamespa

9、ce Validation export interface StringValidator isAcceptable(s: string): boolean;LettersOnlyValidator.ts/ namespace Validation const lettersRegexp = /A-Za-z+$/;export class LettersOnlyValidator implements StringValidator isAcceptable(s: string) return lettersRegexp.test(s);ZipCodeValidator.ts/ namesp

10、ace Validation const numberRegexp = /0-9+$/;export class ZipCodeValidator implements StringValidator isAcceptable(s: string) return s.length = 5 & numberRegexp.test(s);Test.ts/ / / / Some samples to trylet strings = Hello, 98052, 101;/ Validators to uselet validators: s: string: Validation.StringVal

11、idator; = ;validatorsZIP code = new Validation.ZipCodeValidator();validatorsLetters only = new Validation.LettersOnlyValidator();/ Show whether each string passed each validatorstrings.forEach(s = for (let name in validators) console.log( + s + + (validatorsname.isAcceptable(s) ? );当涉及到多件时,我们必须确保所有编

12、译后的代码都被加载了。 我们有两种式。第种式,把所有的输件编译为个输出件,需要使-outFile标记:tsc -outFile sample.js Test.ts编译器会根据源码的引标签动地对输出进排序。你也可以单独地指定每个件。tsc -outFile sample.js Validation.ts LettersOnlyValidator.ts ZipCodeValidator.ts Test.ts第种式,我们可以编译每个件(默认式),那么每个源件都会对应成个JavaScript件。 然后,在页上通过 标签把所有成的JavaScript件按正确的顺序引进来,如:MyTestPage.htm

13、l (excerpt)别名另种简化命名空间操作的法是使import q = x.y.z给常的对象起个短的名字。 不要与来加载模块的 import x = require(name)语法弄混了,这的语法是为指定的符号创建个别名。 你可以这种法为任意标识符创建别名,也包括导的模块中的对象。namespace Shapes export namespace Polygons export class Triangle export class Square import polygons = Shapes.Polygons;let sq = new polygons.Square(); / Same

14、 as new Shapes.Polygons.Square()注意,我们并没有使require关键字,是直接使导符号的限定名赋值。 这与使 var相似,但它还适于类型和导的具有命名空间含义的符号。 重要的是,对于值来讲, import会成与原始符号不同的引,所以改变别名的var值并不会影响原始变量的值。使其它的JavaScript库为了描述不是TypeScript编写的类库的类型,我们需要声明类库导出的API。 由于部分程序库只提供少数的顶级对象,命名空间是来表它们的个好办法。我们称其为声明是因为它不是外部程序的具体实现。 我们通常在 .d.ts写这些声明。 如果你熟悉C/C+,你可以把它们

15、当做 .h件。 让我们看些例。外部命名空间流的程序库D3在全局对象d3定义它的功能。 因为这个库通过个 标签加载(不是通过模块加载器),它的声明件使内部模块来定义它的类型。 为了让TypeScript编译器识别它的类型,我们使外部命名空间声明。 如,我们可以像下这样写:D3.d.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 let d3: D3.Base;W3Cs

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 电子/通信 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号