TypeScript中文手册
14,命名空间
#### 14.1 使用命名空间的验证器 ```typescript //空间命名 namespace Validation { //接口和类在命名空间之外也是可访问的,所以需要使用export //变量lettersRegexp和numberRegexp是实现的细节,不需要导出,因此它们在命名空间外是不能访问的。 export interface StringValidator { isAcceptable(s: string): boolean; } const 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 samples to try let strings = ["Hello", "98052", "101"]; // Validators to use //由于是在命名空间之外访问,因此需要限定类型的名称,比如Validation.LettersOnlyValidator let validators: { [s: string]: Validation.StringValidator; } = {}; validators["ZIP code"] = new Validation.ZipCodeValidator(); validators["Letters only"] = new Validation.LettersOnlyValidator(); // Show whether each string passed each validator for (let s of strings) { for (let name in validators) { console.log(`"${ s }" - ${ validators[name].isAcceptable(s) ? "matches" : "does not match" } ${ name }`); } } ``` #### 14.2 分离到多文件 > 现在,我们把`Validation`命名空间分割成多个文件。 尽管是不同的文件,它们仍是同一个命名空间,并且在使用的时候就如同它们在一个文件中定义的一样。 因为不同文件之间存在依赖关系,所以我们加入了引用标签来告诉编译器文件之间的关联 - ##### Validation.ts ```typescript namespace Validation { export interface StringValidator { isAcceptable(s: string): boolean; } } ``` - ##### LettersOnlyValidator.ts ```typescript /// <reference path="Validation.ts" /> namespace Validation { const lettersRegexp = /^[A-Za-z]+$/; export class LettersOnlyValidator implements StringValidator { isAcceptable(s: string) { return lettersRegexp.test(s); } } } ``` - ##### ZipCodeValidator.ts ```typescript /// <reference path="Validation.ts" /> namespace Validation { const numberRegexp = /^[0-9]+$/; export class ZipCodeValidator implements StringValidator { isAcceptable(s: string) { return s.length === 5 && numberRegexp.test(s); } } } ``` - ##### Test.ts ```typescript /// <reference path="Validation.ts" /> /// <reference path="LettersOnlyValidator.ts" /> /// <reference path="ZipCodeValidator.ts" /> // Some samples to try let strings = ["Hello", "98052", "101"]; // Validators to use let validators: { [s: string]: Validation.StringValidator; } = {}; validators["ZIP code"] = new Validation.ZipCodeValidator(); validators["Letters only"] = new Validation.LettersOnlyValidator(); // Show whether each string passed each validator for (let s of strings) { for (let name in validators) { console.log(""" + s + "" " + (validators[name].isAcceptable(s) ? " matches " : " does not match ") + name); } } ``` 当涉及到多文件时,我们必须确保所有编译后的代码都被加载了。 我们有两种方式。 第一种方式,把所有的输入文件编译为一个输出文件,需要使用`--outFile`标记: ```Shell tsc --outFile sample.js Test.ts ``` 编译器会根据源码里的引用标签自动地对输出进行排序。你也可以单独地指定每个文件。 ```Shell tsc --outFile sample.js Validation.ts LettersOnlyValidator.ts ZipCodeValidator.ts Test.ts ``` 第二种方式,我们可以编译每一个文件(默认方式),那么每个源文件都会对应生成一个JavaScript文件。 然后,在页面上通过`<script>`标签把所有生成的JavaScript文件按正确的顺序引进来,比如: ##### MyTestPage.html (excerpt) ``` <script src="Validation.js" type="text/javascript" /> <script src="LettersOnlyValidator.js" type="text/javascript" /> <script src="ZipCodeValidator.js" type="text/javascript" /> <script src="Test.js" type="text/javascript" /> ``` #### 14.3 命名空间和模块 - 使用命名空间 命名空间是位于全局命名空间下的一个普通的带有名字的JavaScript对象。 它们可以在多文件中同时使用,并通过`--outFile`结合在一起。 命名空间是帮你组织Web应用不错的方式,你可以把所有依赖都放在HTML页面的`<script>`标签里。 - 使用模块 像命名空间一样,模块可以包含代码和声明。 不同的是模块可以*声明*它的依赖。 模块会把依赖添加到模块加载器上(例如CommonJs / Require.js)。 模块也提供了更好的代码重用,更强的封闭性以及更好的使用工具进行优化。 对于Node.js应用来说,模块是默认并推荐的组织代码的方式。 - 命名空间和模块的陷阱 - 对模块使用`/// <reference>` 一个常见的错误是使用`/// <reference>`引用模块文件,应该使用`import`。 - 不必要的命名空间 > TypeScript里模块的一个特点是不同的模块永远也不会在相同的作用域内使用相同的名字。 因为使用模块的人会为它们命名,所以完全没有必要把导出的符号包裹在一个命名空间里。 > > 再次重申,不应该对模块使用命名空间,使用命名空间是为了提供逻辑分组和避免命名冲突。 模块文件本身已经是一个逻辑分组,并且它的名字是由导入这个模块的代码指定,所以没有必要为导出的对象增加额外的模块层。
顶部
收展
底部
[TOC]
目录
1,基础类型
2,变量声明
3,接口
4,类
5,函数
6,泛型
7,枚举
8,类型推论
9,类型兼容性
10,高级类型
11,符号Symbols
12,Iterators(迭代)
13,模块
14,命名空间
15,模块解析