介绍
模块在其自身的作用域里执行,而不是在全局作用域里,意味着定义在一个模块里的变量,函数,类等只有引入模块以后才能使用
导出声明:任何声明都能通过添加export关键字来导出(如:变量,函数,类,类型别名,或接口)
default导出:每个模块都可以使用default模块导出,并且只能有一个default导出
类和函数声明可以直接被标记为默认导出,标记为默认导出的类和函数的名字是可以省略的
// default导出
let JQuery = 'jquery';
declare let $: JQuery;
export default $;
import $ from 'jquery';
export = 和 import = require()
为了支持CommonJS和AMD的exports, TypeScript提供了export =语法
export =语法定义一个模块的导出对象,这里对象是指:类,接口,命名空间,函数或枚举
注:若使用export =导出一个模块,则必须使用TypeScript的特定语法import module = require("module")来导入此模块
let numberRegexps = /^[0-9]+$/;
class ZipCodeValidator {
isAcceptable(s: string) {
return s.length === 5 && numberRegexps.test(s);
}
}
export = ZipCodeValidator;
// test
import zip = require("./ZipCodeValidator");
let strings = ["Hello", "98052", "101"];
let validator = new zip();
strings.forEach(s => {
console.log(`"${ s }" - ${ validator.isAcceptable(s) ? "matches" : "does not match" }`);
});
命名空间
TS1.5以后,内部模块称作命名空间,外部模块则简称为模块
声明:任何使用module关键字来声明一个内部模块的地方都应该使用namespace关键字来替换,能够避免让新的使用者被相似的名称所迷惑
背景:随着更多验证器的加入,需要一种手段来组织代码,以便于在记录他们类型的同时还不用担心与其他对象产生命名冲突,因此需要把验证器包裹到一个命名空间内,而不是放到全局命名空间下
interface StringValidator {
isAcceptable(s: string): boolean;
}
let lettersRegexp = /^[A-Za-z]+$/;
let numberRegexp = /^[0-9]+$/;
class LettersOnlyValidator implements StringValidator {
isAcceptable(s: string){
return lettersRegexp.test(s);
}
}
class ZipStrValidator implements StringValidator {
isAcceptable(s: string){
return s.length === 5 && numberRegexp.test(s);
}
}
let strings = ["Hello", "98052", "101"];
let validators: {[s: string]: StringValidator;} = {};
validators['ZIP code'] = new ZipStrValidator();
validators['Letters only'] = new LettersOnlyValidator();
for(let s of strings){
for(let name in validators){
let isMatch = validators[name].isAcceptable(s);
console.log(`'${ s }' ${ isMatch ? "matches" : "does not match" } '${ name }'.`);
}
}
// 使用命名空间的验证器
namespace Validation {
export interface StringValidator {
isAcceptable(s: string): boolean;
}
let lettersRegexp = /^[A-Za-z]+$/;
let numberRegexp = /^[0-9]+$/;
export class LettersOnlyValidator implements StringValidator {
isAcceptable(s: string){
return lettersRegexp.test(s);
}
}
export class ZipStrValidator implements StringValidator {
isAcceptable(s: string){
return s.length === 5 && numberRegexp.test(s);
}
}
}
let strings = ["Hello", "98052", "101"];
let validators: {[s: string]: Validation.StringValidator;} = {};
validators['ZIP code'] = new Validation.ZipStrValidator();
validators['Letters only'] = new Validation.LettersOnlyValidator();
for(let s of strings){
for(let name in validators){
let isMatch = validators[name].isAcceptable(s);
console.log(`'${ s }' ${ isMatch ? "matches" : "does not match" } '${ name }'.`);
}
}
// 多文件中的命名空间
/// <reference path="namespace-validate.ts" />
/// <reference path="namespace-letters.ts" />
/// <reference path="namespace-zipcode.ts" />
let strings = ["Hello", "98052", "101"];
let validators: { [s: string]: Validation.StringValidator; } = {};
validators["ZIP code"] = new Validation.ZipCodeValidator();
validators["Letters only"] = new Validation.LettersOnlyValidator();
for (let s of strings) {
for (let name in validators) {
console.log(`"${ s }" - ${ validators[name].isAcceptable(s) ? "matches" : "does not match" } ${ name }`);
}
}
命名空间和模块
命名空间:是位于全局命名空间下的一个普通的带有名字的JavaScript对象
缺点:就像其他全局命名空间污染一样,很难识别组件之间的依赖关系,尤其是在大型应用中
模块:模块可以包含代码和声明,跟命名空间不同的是,模块可以声明他的依赖
注:模块提供了很好的代码重用,更强的封闭性以及更好的使用工具进行优化