> For the complete documentation index, see [llms.txt](https://yes-1-am.gitbook.io/blog/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yes-1-am.gitbook.io/blog/typescript-yu-fa/ming-ming-kong-jian.md).

# 命名空间

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

## 1. 使用命名空间

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

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

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

## 2. 多文件中的命名空间

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

*Validation.ts*

```javascript
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` &#x20;

   `tsc --outFile sample.js Test.ts` &#x20;
2. 每个文件单独编译，最后在页面中依次将所有JS文件按照正确顺序引入

```markup
<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" />
```
