TypeScript基礎(chǔ)入門(mén)之模塊(一)

轉(zhuǎn)發(fā) # TypeScript基礎(chǔ)入門(mén)之模塊(一)

模塊

關(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 {)勺三。

介紹

從ECMAScript 2015開(kāi)始雷滚,JavaScript引入了模塊的概念。TypeScript也沿用這個(gè)概念吗坚。

模塊在其自身的作用域里執(zhí)行祈远,而不是在全局作用域里;這意味著定義在一個(gè)模塊里的變量商源,函數(shù)车份,類(lèi)等等在模塊外部是不可見(jiàn)的,除非你明確地使用export形式之一導(dǎo)出它們牡彻。 相反扫沼,如果想使用其它模塊導(dǎo)出的變量,函數(shù),類(lèi)充甚,接口等的時(shí)候以政,你必須要導(dǎo)入它們霸褒,可以使用import形式之一伴找。

模塊是自聲明的;兩個(gè)模塊之間的關(guān)系是通過(guò)在文件級(jí)別上使用imports和exports建立的废菱。

模塊使用模塊加載器去導(dǎo)入其它的模塊技矮。 在運(yùn)行時(shí),模塊加載器的作用是在執(zhí)行此模塊代碼前去查找并執(zhí)行這個(gè)模塊的所有依賴殊轴。 大家最熟知的JavaScript模塊加載器是服務(wù)于Node.js的 CommonJS和服務(wù)于Web應(yīng)用的Require.js衰倦。

TypeScript與ECMAScript 2015一樣,任何包含頂級(jí)import或者export的文件都被當(dāng)成一個(gè)模塊旁理。相反地樊零,如果一個(gè)文件不帶有頂級(jí)的import或者export聲明,那么它的內(nèi)容被視為全局可見(jiàn)的(因此對(duì)模塊也是可見(jiàn)的)孽文。

導(dǎo)出

導(dǎo)出聲明

任何聲明(比如變量驻襟,函數(shù),類(lèi)芋哭,類(lèi)型別名或接口)都能夠通過(guò)添加export關(guān)鍵字來(lái)導(dǎo)出沉衣。

Validation.ts

export interface StringValidator {
  isAcceptable(s: string): boolean;
}

ZipCodeValidator.ts

export const numberRegexp = /^[0-9]+$/;

export class ZipCodeValidator implements StringValidator {
  isAcceptable(s: string): boolean {
    return s.length === 5 && numberRegexp.test(s);
  }
}

導(dǎo)出語(yǔ)句

導(dǎo)出語(yǔ)句很便利,因?yàn)槲覀兛赡苄枰獙?duì)導(dǎo)出的部分重命名减牺,所以上面的例子可以這樣改寫(xiě):

export const numberRegexp = /^[0-9]+$/;

class ZipCodeValidator implements StringValidator {
  isAcceptable(s: string): boolean {
    return s.length === 5 && numberRegexp.test(s);
  }
}

export { ZipCodeValidator };
export { ZipCodeValidator as mainValidator }

重新導(dǎo)出

我們經(jīng)常會(huì)去擴(kuò)展其它模塊豌习,并且只導(dǎo)出那個(gè)模塊的部分內(nèi)容。 重新導(dǎo)出功能并不會(huì)在當(dāng)前模塊導(dǎo)入那個(gè)模塊或定義一個(gè)新的局部變量拔疚。
ParseIntBasedZipCodeValidator.ts

export class ParseIntBasedZipCodeValidator {
  isAcceptable(s: string): boolean {
    return s.length === 5 && parseInt(s).toString() === s;
  }
}

export { ZipCodeValidator as RegExpBaseZipCodeValidator } from './ZipCodeValidator';

或者一個(gè)模塊可以包裹多個(gè)模塊肥隆,并把他們導(dǎo)出的內(nèi)容聯(lián)合在一起通過(guò)語(yǔ)法:export * from "module"

AllValidators.ts

export * from "./StringValidator"; // exports interface 'StringValidator'
export * from "./ZipCodeValidator";  // exports class 'ZipCodeValidator'

導(dǎo)入

模塊的導(dǎo)入操作與導(dǎo)出一樣簡(jiǎn)單稚失。 可以使用以下import形式之一來(lái)導(dǎo)入其它模塊中的導(dǎo)出內(nèi)容栋艳。

導(dǎo)入一個(gè)模塊中的某個(gè)導(dǎo)出內(nèi)容

import { ZipCodeValidator } from "./ZipCodeValidator";

let myValidator = new ZipCodeValidator();

可以對(duì)導(dǎo)入內(nèi)容重命名

import { ZipCodeValidator as ZCV } from "./ZipCodeValidator";
let myValidator = new ZCV();

將整個(gè)模塊導(dǎo)入到一個(gè)變量,并通過(guò)它來(lái)訪問(wèn)模塊的導(dǎo)出部分

import * as validator from "./ZipCodeValidator";
let myValidator = new validator.ZipCodeValidator();

具有副作用的導(dǎo)入模塊

盡管不推薦這么做墩虹,一些模塊會(huì)設(shè)置一些全局狀態(tài)供其它模塊使用嘱巾。 這些模塊可能沒(méi)有任何的導(dǎo)出或用戶根本就不關(guān)注它的導(dǎo)出。 使用下面的方法來(lái)導(dǎo)入這類(lèi)模塊:

import "./my-module.js";

默認(rèn)導(dǎo)出

每個(gè)模塊都可以有一個(gè)default導(dǎo)出诫钓。 默認(rèn)導(dǎo)出使用 default關(guān)鍵字標(biāo)記旬昭;并且一個(gè)模塊只能夠有一個(gè)default導(dǎo)出。 需要使用一種特殊的導(dǎo)入形式來(lái)導(dǎo)入 default導(dǎo)出菌湃。

default導(dǎo)出十分便利问拘。 比如,像JQuery這樣的類(lèi)庫(kù)可能有一個(gè)默認(rèn)導(dǎo)出 jQuery或,并且我們基本上也會(huì)使用同樣的名字jQuery或導(dǎo)出JQuery骤坐。

JQuery.d.ts

declare let $: JQuery;
export default $;

App.ts

import $ from "JQuery";

$("button.continue").html( "Next Step..." );

類(lèi)和函數(shù)聲明可以直接被標(biāo)記為默認(rèn)導(dǎo)出绪杏。 標(biāo)記為默認(rèn)導(dǎo)出的類(lèi)和函數(shù)的名字是可以省略的。

ZipCodeValidator.ts

export default class ZipCodeValidator {
    static numberRegexp = /^[0-9]+$/;
    isAcceptable(s: string) {
        return s.length === 5 && ZipCodeValidator.numberRegexp.test(s);
    }
}

Test.ts

import validator from "./ZipCodeValidator";

let myValidator = new validator();

或者

StaticZipCodeValidator.ts

const numberRegexp = /^[0-9]+$/;

export default function (s: string) {
    return s.length === 5 && numberRegexp.test(s);
}

Test.ts

import validate from "./StaticZipCodeValidator";

let strings = ["Hello", "98052", "101"];

// Use function validate
strings.forEach(s => {
  console.log(`"${s}" ${validate(s) ? " matches" : " does not match"}`);
});

default導(dǎo)出也可以是一個(gè)值
OneTwoThree.ts

export default "123";

Log.ts

import num from "./OneTwoThree";

console.log(num); // "123"

export =import = require()
CommonJS和AMD都有一個(gè)exports對(duì)象的概念纽绍,它包含了一個(gè)模塊的所有導(dǎo)出內(nèi)容蕾久。

它們也支持把exports替換為一個(gè)自定義對(duì)象。 默認(rèn)導(dǎo)出就好比這樣一個(gè)功能拌夏;然而僧著,它們卻并不相互兼容。 TypeScript模塊支持 export =語(yǔ)法以支持傳統(tǒng)的CommonJS和AMD的工作流模型障簿。

export =語(yǔ)法定義一個(gè)模塊的導(dǎo)出對(duì)象盹愚。 它可以是類(lèi),接口站故,命名空間皆怕,函數(shù)或枚舉。

若要導(dǎo)入一個(gè)使用了export =的模塊時(shí)西篓,必須使用TypeScript提供的特定語(yǔ)法import module = require("module")愈腾。

ZipCodeValidator.ts

let numberRegexp = /^[0-9]+$/;
class ZipCodeValidator {
    isAcceptable(s: string) {
        return s.length === 5 && numberRegexp.test(s);
    }
}
export = ZipCodeValidator;

Test.ts

import zip = require("./ZipCodeValidator");

// 嘗試一些字符
let strings = ["Hello", "98052", "101"];

// 使用validator
let validator = new zip();

// 檢測(cè)每個(gè)字符串,是否通過(guò)驗(yàn)證
strings.forEach(s => {
  console.log(`"${ s }" - ${ validator.isAcceptable(s) ? "matches" : "does not match" }`);
});
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末污淋,一起剝皮案震驚了整個(gè)濱河市顶滩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寸爆,老刑警劉巖礁鲁,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異赁豆,居然都是意外死亡仅醇,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)魔种,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)析二,“玉大人,你說(shuō)我怎么就攤上這事节预∫渡悖” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵安拟,是天一觀的道長(zhǎng)蛤吓。 經(jīng)常有香客問(wèn)我,道長(zhǎng)糠赦,這世上最難降的妖魔是什么会傲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任锅棕,我火速辦了婚禮,結(jié)果婚禮上淌山,老公的妹妹穿的比我還像新娘裸燎。我一直安慰自己,他們只是感情好泼疑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布德绿。 她就那樣靜靜地躺著,像睡著了一般王浴。 火紅的嫁衣襯著肌膚如雪脆炎。 梳的紋絲不亂的頭發(fā)上梅猿,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天氓辣,我揣著相機(jī)與錄音,去河邊找鬼袱蚓。 笑死钞啸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喇潘。 我是一名探鬼主播体斩,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼颖低!你這毒婦竟也來(lái)了絮吵?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤忱屑,失蹤者是張志新(化名)和其女友劉穎蹬敲,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體莺戒,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伴嗡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了从铲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘪校。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖名段,靈堂內(nèi)的尸體忽然破棺而出阱扬,到底是詐尸還是另有隱情,我是刑警寧澤伸辟,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布麻惶,位于F島的核電站,受9級(jí)特大地震影響自娩,放射性物質(zhì)發(fā)生泄漏用踩。R本人自食惡果不足惜渠退,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脐彩。 院中可真熱鬧碎乃,春花似錦、人聲如沸惠奸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)佛南。三九已至梗掰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嗅回,已是汗流浹背及穗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绵载,地道東北人埂陆。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像娃豹,于是被迫代替她去往敵國(guó)和親焚虱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 紅龍感覺(jué)上好像是數(shù)據(jù)懂版,股票數(shù)據(jù)鹃栽。 白風(fēng)很搞怪。 藍(lán)夜很安靜躯畴,有種要睡了的感覺(jué)民鼓。 黃種子好像仙女飄飄,怪優(yōu)雅的私股。 紅...
    阿B_欣閱讀 255評(píng)論 0 0
  • 在林間深處摹察,微風(fēng)給我擁抱。在溪水流淌的河流中倡鲸,流水給我擁抱供嚎。而我希望在你的面前,你給我擁抱
    清風(fēng)丶風(fēng)塵閱讀 279評(píng)論 0 0
  • 仰望著眼前高樓大廈車(chē)水馬龍它是我的目標(biāo)峭状,凝視片刻深吸氣奔著目標(biāo)前進(jìn)克滴,每個(gè)人都有不同的夢(mèng)想,有夢(mèng)想就去追求优床。
    雨馨l(fā)閱讀 140評(píng)論 0 1
  • 2012年劝赔,我認(rèn)識(shí)了你,在那個(gè)滿懷激情又無(wú)比悲傷的夏天胆敞。 初見(jiàn)你時(shí)着帽,我以為你的性格很像我的一個(gè)閨蜜杂伟,沉靜,內(nèi)斂仍翰,拋...
    暗黑禁衛(wèi)軍閱讀 383評(píng)論 0 0