前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TypeScript 的命名空间 namespace

TypeScript 的命名空间 namespace

作者头像
Jerry Wang
发布2021-07-21 10:15:40
5600
发布2021-07-21 10:15:40
举报

官方链接

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

从哪里开始?

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

Validators in a single file

测试代码:

代码语言:javascript
复制
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。

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

代码语言:javascript
复制
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

代码语言:javascript
复制
namespace Validation {
  export interface StringValidator {
    isAcceptable(s: string): boolean;
  }
}

LettersOnlyValidator.ts

代码语言:javascript
复制
/// <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

代码语言:javascript
复制
/// <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 文件。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-07-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 从哪里开始?
  • Validators in a single file
  • 引入命名空间的概念
  • 多文件组成的命名空间
    • validation.ts
      • LettersOnlyValidator.ts
        • ZipCodeValidator.ts
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档