TypeScript基礎入門之名稱空間(一)
名稱空間
關於術語的一點說明: 請務必注意一點,TypeScript 1.5裡術語名已經發生了變化。 “內部模組”現在稱做“名稱空間”。 “外部模組”現在則簡稱為“模組”,這是為了與 ECMAScript 2015裡的術語保持一致,(也就是說 module X { 相當於現在推薦的寫法 namespace X {)。
介紹
這篇文章描述瞭如何在TypeScript裡使用名稱空間(之前叫做“內部模組”)來組織你的程式碼。 就像我們在術語說明裡提到的那樣,“內部模組”現在叫做“名稱空間”。 另外,任何使用 module關鍵字來宣告一個內部模組的地方都應該使用namespace關鍵字來替換。 這就避免了讓新的使用者被相似的名稱所迷惑。
第一步
我們先來寫一段程式並將在整篇文章中都使用這個例子。 我們定義幾個簡單的字串驗證器,假設你會使用它們來驗證表單裡的使用者輸入或驗證外部資料。
所有的驗證器都放在一個檔案裡
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。 相反的,變數 lettersRegexp和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 }`); } }
未完待續...