博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TypeScript - Modules
阅读量:5101 次
发布时间:2019-06-13

本文共 4175 字,大约阅读时间需要 13 分钟。

标签: TypeScript


(主要是来加深自己的理解,以机器翻译为主,有问题可以指出,十分感谢)

原文链接
这是cmd markdown中的链接,欢迎批注。

这篇文章概括了在TypeScript中使用模块组织代码的各种方法。我们将包括内部模块和外部模块以及讨论如何恰当使用他们。我们还会介绍一些外部模块的进阶使用,并且指出一下在使用中常见的错误。

第一步

接下来从我们全篇都会使用的程序开始。我们写过一个小型的字符串验证程序,可以用来验证网页上用户输入的内容或者外部文件的数据格式。

interface StringValidator {    isAcceptable(s: string): boolean;}var lettersRegexp = /^[A-Za-z]+$/;var 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 tryvar strings = ['Hello', '98052', '101'];// Validators to usevar validators: { [s: string]: StringValidator; } = {};validators['ZIP code'] = new ZipCodeValidator();validators['Letters only'] = new LettersOnlyValidator();// Show whether each string passed each validatorstrings.forEach(s => {    for (var name in validators) {        console.log('"' + s + '" ' + (validators[name].isAcceptable(s) ? ' matches ' : ' does not match ') + name);    }});

模块化

随着更多的验证器的添加,我们需要某种组织方案,以便我们能够很好的跟踪我们的类型,并且不需要担心和其他对象名字的冲突。现在我们把对象封装到Modules中来替代向全局的命名空间中添加大量的名字。

在例子中,我们把所有validator相关的类型移入Validation 的module中。因为我们需要在外部访问module中的类和接口,所以我们在他们前面加上了export。相反的,变量lettersRegexpnumberRegexp是内部实现逻辑,所以它们没有被输出这样就无法在外部访问到它们。在测试代码底部,我们现在需要通过名称来从外部访问module中的类型Validation.LettersOnlyValidator等。

Modularized Validators

module Validation {    export interface StringValidator {        isAcceptable(s: string): boolean;    }    var lettersRegexp = /^[A-Za-z]+$/;    var 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 tryvar strings = ['Hello', '98052', '101'];// Validators to usevar validators: { [s: string]: Validation.StringValidator; } = {};validators['ZIP code'] = new Validation.ZipCodeValidator();validators['Letters only'] = new Validation.LettersOnlyValidator();// Show whether each string passed each validatorstrings.forEach(s => {    for (var name in validators) {        console.log('"' + s + '" ' + (validators[name].isAcceptable(s) ? ' matches ' : ' does not match ') + name);    }});

分离模块文件

随着程序的增长,我们需要把代码分割到很多文件中来让其更加易于维护。

现在,我们把Validation module 分割到多个文件中。虽然他们被分割了,但是它们依然包含在同一个module中,并且在使用中和声明在一个位置是一样的。因为文件之间的依赖关系,所以我们在文件开头添加了引用的标签来告诉编译器他们之间的引用关系,除此我们测试代码是没有变化的。

多文件的内部modules

Validation.ts

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

LettersOnlyValidator.ts

/// 
module Validation { var lettersRegexp = /^[A-Za-z]+$/; export class LettersOnlyValidator implements StringValidator { isAcceptable(s: string) { return lettersRegexp.test(s); } }}

ZipCodeValidator.ts

/// 
module Validation { var numberRegexp = /^[0-9]+$/; export class ZipCodeValidator implements StringValidator { isAcceptable(s: string) { return s.length === 5 && numberRegexp.test(s); } }}

Test.ts

/// 
///
///
// Some samples to tryvar strings = ['Hello', '98052', '101'];// Validators to usevar validators: { [s: string]: Validation.StringValidator; } = {};validators['ZIP code'] = new Validation.ZipCodeValidator();validators['Letters only'] = new Validation.LettersOnlyValidator();// Show whether each string passed each validatorstrings.forEach(s => { for (var name in validators) { console.log('"' + s + '" ' + (validators[name].isAcceptable(s) ? ' matches ' : ' does not match ') + name); }});

如果涉及多个文件,我们需要确保所有需要编译的代码能够正确的加载。有两种方法能够使用。

第一种:我们可以使用--out 命令串联所有输入的文件编译到一个javascript文件:

tsc --out sample.js Test.ts

编译器会自动根据引用标签编译到一个js文件。你也可以详细指定文件:

tsc --out sample.js Validation.ts LettersOnlyValidator.ts ZipCodeValidator.ts Test.ts

第二种:我们也可以采用预先文件的编辑来加载多个文件,我们可以使用script tag在web页面加载来控制文件顺序,例如:

MyTestPage.html (excerpt)

转载于:https://www.cnblogs.com/darktutu/p/4521764.html

你可能感兴趣的文章
求众数leetcode(169)+投票算法
查看>>
leetcode(120)三角形最小路径之和
查看>>
html样式
查看>>
插入、删除和随机查询时间复杂度都为O(1) leetcode 381
查看>>
实战Netty集群
查看>>
多线程 Threading Multiprocessing(Python)
查看>>
多线程
查看>>
Hadoop-MapReduce
查看>>
Hadoop-HDFS
查看>>
CodeChef - METEORAK Meteor
查看>>
andorid月总结
查看>>
iis部署错误:HTTP 错误 500.21 - Internal Server Error
查看>>
Linux系统知识汇总
查看>>
spring mvc 提供的几个常用的扩展点
查看>>
Spring对字段和集合的注入---依赖注入
查看>>
Java 学习 day09
查看>>
P4345 [SHOI2015]超能粒子炮·改
查看>>
暂且解决INSTALL_FAILED_SHARED_USER_INCOMPATIBLE错误
查看>>
Windows10下安装MySQL8.0
查看>>
点分治
查看>>