日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TypeScript 的命名空间 namespace

發布時間:2023/12/19 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。