最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
創(chuàng)新互聯(lián)TypeScript教程:TypeScript命名空間

關(guān)于術(shù)語(yǔ)的一點(diǎn)說(shuō)明: 請(qǐng)務(wù)必注意一點(diǎn),TypeScript 1.5里術(shù)語(yǔ)名已經(jīng)發(fā)生了變化。 “內(nèi)部模塊”現(xiàn)在稱(chēng)做“命名空間”。 “外部模塊”現(xiàn)在則簡(jiǎn)稱(chēng)為“模塊”,這是為了與 ECMAScript 2015里的術(shù)語(yǔ)保持一致,(也就是說(shuō)module X { 相當(dāng)于現(xiàn)在推薦的寫(xiě)法 namespace X {)。

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的永昌網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

介紹

這篇文章描述了如何在TypeScript里使用命名空間(之前叫做“內(nèi)部模塊”)來(lái)組織你的代碼。

就像我們?cè)谛g(shù)語(yǔ)說(shuō)明里提到的那樣,“內(nèi)部模塊”現(xiàn)在叫做“命名空間”。

另外,任何使用module關(guān)鍵字來(lái)聲明一個(gè)內(nèi)部模塊的地方都應(yīng)該使用namespace關(guān)鍵字來(lái)替換。

這就避免了讓新的使用者被相似的名稱(chēng)所迷惑。

第一步

我們先來(lái)寫(xiě)一段程序并將在整篇文章中都使用這個(gè)例子。 我們定義幾個(gè)簡(jiǎn)單的字符串驗(yàn)證器,假設(shè)你會(huì)使用它們來(lái)驗(yàn)證表單里的用戶輸入或驗(yàn)證外部數(shù)據(jù)。

所有的驗(yàn)證器都放在一個(gè)文件里

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
strings.forEach(s => {
    for (let name in validators) {
        console.log(""" + s + "" " + (validators[name].isAcceptable(s) ? " matches " : " does not match ") + name);
    }
});

命名空間

隨著更多驗(yàn)證器的加入,我們需要一種手段來(lái)組織代碼,以便于在記錄它們類(lèi)型的同時(shí)還不用擔(dān)心與其它對(duì)象產(chǎn)生命名沖突。 因此,我們把驗(yàn)證器包裹到一個(gè)命名空間內(nèi),而不是把它們放在全局命名空間下。

下面的例子里,把所有與驗(yàn)證器相關(guān)的類(lèi)型都放到一個(gè)叫做Validation的命名空間里。 因?yàn)槲覀兿胱屵@些接口和類(lèi)在命名空間之外也是可訪問(wèn)的,所以需要使用 export。 相反的,變量 lettersRegexpnumberRegexp是實(shí)現(xiàn)的細(xì)節(jié),不需要導(dǎo)出,因此它們?cè)诿臻g外是不能訪問(wèn)的。 在文件末尾的測(cè)試代碼里,由于是在命名空間之外訪問(wèn),因此需要限定類(lèi)型的名稱(chēng),比如 Validation.LettersOnlyValidator。

使用命名空間的驗(yàn)證器

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
strings.forEach(s => {
    for (let name in validators) {
        console.log(`"${ s }" - ${ validators[name].isAcceptable(s) ? "matches" : "does not match" } ${ name }`);
    }
});

分離到多文件

當(dāng)應(yīng)用變得越來(lái)越大時(shí),我們需要將代碼分離到不同的文件中以便于維護(hù)。

多文件中的命名空間

現(xiàn)在,我們把Validation命名空間分割成多個(gè)文件。 盡管是不同的文件,它們?nèi)允峭粋€(gè)命名空間,并且在使用的時(shí)候就如同它們?cè)谝粋€(gè)文件中定義的一樣。 因?yàn)椴煌募g存在依賴(lài)關(guān)系,所以我們加入了引用標(biāo)簽來(lái)告訴編譯器文件之間的關(guān)聯(lián)。 我們的測(cè)試代碼保持不變。

Validation.ts
namespace Validation {
    export interface StringValidator {
        isAcceptable(s: string): boolean;
    }
}
LettersOnlyValidator.ts
/// 
namespace Validation {
    const lettersRegexp = /^[A-Za-z]+$/;
    export class LettersOnlyValidator implements StringValidator {
        isAcceptable(s: string) {
            return lettersRegexp.test(s);
        }
    }
}
ZipCodeValidator.ts
/// 
namespace Validation {
    const numberRegexp = /^[0-9]+$/;
    export class ZipCodeValidator implements StringValidator {
        isAcceptable(s: string) {
            return s.length === 5 && numberRegexp.test(s);
        }
    }
}
Test.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();
validators["Letters only"] = new Validation.LettersOnlyValidator();
// Show whether each string passed each validator
strings.forEach(s => {
    for (let name in validators) {
        console.log(""" + s + "" " + (validators[name].isAcceptable(s) ? " matches " : " does not match ") + name);
    }
});

當(dāng)涉及到多文件時(shí),我們必須確保所有編譯后的代碼都被加載了。 我們有兩種方式。

第一種方式,把所有的輸入文件編譯為一個(gè)輸出文件,需要使用--outFile標(biāo)記:

tsc --outFile sample.js Test.ts

編譯器會(huì)根據(jù)源碼里的引用標(biāo)簽自動(dòng)地對(duì)輸出進(jìn)行排序。你也可以單獨(dú)地指定每個(gè)文件。

tsc --outFile sample.js Validation.ts LettersOnlyValidator.ts ZipCodeValidator.ts Test.ts

第二種方式,我們可以編譯每一個(gè)文件(默認(rèn)方式),那么每個(gè)源文件都會(huì)對(duì)應(yīng)生成一個(gè)JavaScript文件。 然后,在頁(yè)面上通過(guò)