官方链接

关于术语的说明:需要注意的是,在 TypeScript 1.5 中,术语发生了变化。 “内部模块”现在是“命名空间”。 “外部模块”现在只是“模块”,与 ECMAScript 2015 的术语保持一致。

从哪里开始?

让我们从我们将在本页中用作示例的程序开始。 我们编写了一小组简单的字符串验证器,您可能会编写这些代码来检查用户在网页表单上的输入或检查外部提供的数据文件的格式。

Validators in a single file

测试代码:

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 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
let validators: { [s: string]: StringValidator } = {};
validators["ZIP code"] = new ZipCodeValidator();
validators["Letters only"] = new LettersOnlyValidator();
// Show whether each string passed each validator
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}'.`);}
}

引入命名空间的概念

随着我们添加更多验证器,我们将需要某种组织方案,以便我们可以跟踪我们的类型,而不必担心与其他对象的名称冲突。 与其将许多不同的名称放入全局命名空间,不如将我们的对象包装到一个命名空间中。

在这个例子中,我们将所有与验证器相关的实体移动到一个名为 Validation 的命名空间中。 因为我们希望这里的接口和类在命名空间之外是可见的,所以我们以 export 开头。 相反,变量 letterRegexp 和 numberRegexp 是实现细节,因此它们不会被导出,并且对于命名空间之外的代码是不可见的。 在文件底部的测试代码中,我们现在需要限定在命名空间之外使用时的类型名称,例如 Validation.LettersOnlyValidator。

引入命名空间之后的实现:

namespace Validation {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
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}`);}
}

多文件组成的命名空间

在这里,我们将在许多文件中拆分我们的 Validation 命名空间。 即使这些文件是分开的,它们也可以贡献于同一个命名空间,并且可以像在一个地方定义它们一样被使用。 因为文件之间存在依赖关系,我们将添加引用标签来告诉编译器文件之间的关系。 我们的测试代码在其他方面没有改变。

validation.ts

namespace Validation {export interface StringValidator {isAcceptable(s: string): boolean;}
}

LettersOnlyValidator.ts

/// <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

/// <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);}}
}

我们将没有定义实现的声明称为“环境”。 通常这些定义在 .d.ts 文件中。 如果您熟悉 C/C++,您可以将它们视为 .h 文件。

TypeScript 的命名空间 namespace相关推荐

  1. 为 Vue3 学点 TypeScript, 命名空间(namespace)是什么?

    往期目录 第一课, 体验typescript 第二课, 基础类型和入门高级类型 第三课, 泛型 第四课, 解读高级类型 第五课, 命名空间(namespace)是什么 什么时候要用命名空间? 如果你发 ...

  2. C++中的命名空间namespace

    1.Cpp中的命名空间 假设这样一种情况,当一个班上有两个名叫Zara的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等.同样的情况, ...

  3. PHP 命名空间(namespace)

    2019独角兽企业重金招聘Python工程师标准>>> PHP 命名空间(namespace) PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Ja ...

  4. PHP命名空间(Namespace)的使用详解(转)

    对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...

  5. php命名空间 动态 new,PHP命名空间(namespace)的动态访问及使用技巧_php实例

    PHP的命名空间(namespace)是PHP 5.3中加入最重要的一个新特性,这个概念在C#中已经很早就有了,php中的namespace其实和c#的概念是一样的. 一.动态访问命名空间的元素 na ...

  6. 【C++ 语言】命名空间 ( namespace | 命名空间定义 | 命名空间嵌套 | 域作用符 | 与 include 对比 )

    文章目录 命名空间简介 自定义命名空间 自定义嵌套命名空间 域作用符 命名空间 与 include 区别 命名空间定义与使用完整代码 命名空间简介 命名空间 ( namespace ) : 1.命名空 ...

  7. C++命名空间namespace

    1.namespace的作用 命名空间namespace是ANSI C++引入的可以由用户命名的作用域,用来处理程序中常见的重名冲突,不同的命名空间中可以存在名字相同的标识符而不会相互干扰,防止名字污 ...

  8. 【小白学习C++ 教程】十三、C++命名空间namespace

    @Author:Runsen 文章目录 访问命名空间 嵌套命名空间 命名空间别名 任何C++程序都有声明namespace,比如下面的C++程序没有声明namespace int main() {in ...

  9. php namespace原理作用,php 命名空间(namespace)原理与用法实例小结

    本文实例讲述了php 命名空间(namespace)原理与用法.分享给大家供大家参考,具体如下: 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致 ...

最新文章

  1. Discuz! X3.2新增管理员无法登录后台的解决办法
  2. 数据结构学习笔记(六):二叉树(Binary Tree)
  3. Angular 依赖的测试和 Fake
  4. 知乎:学计算机的女生都怎么样了?
  5. 网页设计图片向上浮动_果冻公开课第六课:5分钟理解浮动布局
  6. java swing 帮助文档,在Java Swing应用程序中创建在线帮助-使用pdf用户文档
  7. 刮刮乐html5效果擦除,HTML5实现刮刮卡的效果
  8. 将高德坐标拾取工具放入Element UI 对话框
  9. 【2020.2.29更新】高通蓝牙芯片QCC3003,QCC3008 学习视频教材
  10. 推荐一款好用的加密软件 filepackage 文件加密 U盘加密 移动硬盘加密
  11. CUDA优化之PReLU性能调优
  12. UE4 蓝图事件调度器Event Dispatcher
  13. 14年第五届蓝桥杯C/C++大学B组真题———史丰收算法
  14. python 爬虫。爬取小说--斗破苍穹
  15. 聚类生成anchor框的尺寸和比例
  16. Redis设置密码,查看密码,修改密码,忘记密码。
  17. 虹科小课堂|密度测量,你了解多少?
  18. 提高写文档的能力(程序员)
  19. eclipse安装svn插件报错
  20. 记一次windows 2008 R2 SP1中永恒之蓝病毒的处理过程

热门文章

  1. 记录使用websocket时因为Sec-Websocket-Protocol遇到的一个问题
  2. bzoj5252 [2018多省省队联测]林克卡特树
  3. 【Android开发坑系列】之事件
  4. RouterOS SOCKS代理服务器(官方文档翻译)
  5. C#模板编程(1):有了泛型,为什么还需要模板?
  6. 2016/09/16面试资料汇总
  7. “Zhuang.Data”轻型数据库访问框架(一)开篇介绍
  8. 9.使用原生js实现类似于jquery的动画
  9. 使用递归方法遍历TreeView的节点如配置则勾选
  10. iOS组件化-带你一步步实现项目的组件化