命名空间

"内部模块"现在称做"命名空间"。 "外部模块"现在则简称为"模块"

1. 使用命名空间

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; } = {};

// 需要使用 Validation 命名空间加 `.`属性访问符进行访问
validators["ZIP code"] = new Validation.ZipCodeValidator();
validators["Letters only"] = new Validation.LettersOnlyValidator();

以上的例子将代码放在了 Validation 的命名空间里,如果要让内部的接口或类,在命名空间之外能被访问,则需要export。 相反的,变量 letterRegexpnunmberRegexp 是实现细节,不必导出。

2. 多文件中的命名空间

当应用越来越大,需要将代码分离到不同的文件中,此时,就可能将命名空间分割到多个文件

Validation.ts

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

LettersOnlyValidator.ts 添加引用标签 /// <reference path="Validation.ts" />

/// <reference path="Validation.ts" />
namespace Validation {
    const lettersRegexp = /^[A-Za-z]+$/;
    export class LettersOnlyValidator implements StringValidator {
        isAcceptable(s: string) {
            return lettersRegexp.test(s);
        }
    }
}

在使用时,也需要指定引用标签: Test.ts

/// <reference path="Validation.ts" />
/// <reference path="LettersOnlyValidator.ts" />

// Some samples to try
let strings = ["Hello", "98052", "101"];

// Validators to use
let validators: { [s: string]: Validation.StringValidator; } = {};
validators["ZIP code"] = new Validation.ZipCodeValidator();

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

涉及到多文件时,需要确保编译后的代码都被加载了,两种方式:

  1. 将所有输入文件编译为一个输出文件,使用 --outFile

    tsc --outFile sample.js Test.ts

  2. 每个文件单独编译,最后在页面中依次将所有JS文件按照正确顺序引入

<script src="Validation.js" type="text/javascript" />
<script src="LettersOnlyValidator.js" type="text/javascript" />
<script src="ZipCodeValidator.js" type="text/javascript" />
<script src="Test.js" type="text/javascript" />

Last updated