天天看點

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 {

   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 {

     return s.length === 5 && numberRegexp.test(s);

let validators: { [s: string]: Validation.StringValidator } = {};

validators["ZIP code"] = new Validation.ZipCodeValidator();

validators["Letters only"] = new Validation.LettersOnlyValidator();

   console.log(

     `"${s}" - ${

       validators[name].isAcceptable(s) ? "matches" : "does not match"

     } ${name}`

   );

多檔案組成的命名空間

在這裡,我們将在許多檔案中拆分我們的 Validation 命名空間。 即使這些檔案是分開的,它們也可以貢獻于同一個命名空間,并且可以像在一個地方定義它們一樣被使用。 因為檔案之間存在依賴關系,我們将添加引用标簽來告訴編譯器檔案之間的關系。 我們的測試代碼在其他方面沒有改變。

validation.ts

TypeScript 的命名空間 namespace

繼續閱讀