TypeScript 的命名空间 namespace
官方鏈接
關于術語的說明:需要注意的是,在 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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 青龙湖
- 下一篇: TypeScript 类装饰器的一个例子