命名空间跟作用域是什么关系_十二、命名空间跟模块

fd85ca4b0c95914f34bcf4f8b89010cd.png

十二、命名空间跟模块

介绍

模块在其自身的作用域里执行,而不是在全局作用域里,意味着定义在一个模块里的变量,函数,类等只有引入模块以后才能使用
导出声明:任何声明都能通过添加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对象 缺点:就像其他全局命名空间污染一样,很难识别组件之间的依赖关系,尤其是在大型应用中
模块:模块可以包含代码和声明,跟命名空间不同的是,模块可以声明他的依赖 注:模块提供了很好的代码重用,更强的封闭性以及更好的使用工具进行优化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值