一如叼、TypeScript 模塊機(jī)制
javascript從es5之前都缺少一種模塊機(jī)制,無法通過js引入文件陨亡,于是requirejs等等的加載器應(yīng)運(yùn)而生舵稠。這些加載器的使用也并不統(tǒng)一,產(chǎn)生了amd嗓违,commonjs九巡,umd等等的規(guī)范,各有所長蹂季。直到es6的發(fā)布冕广,js自身引入的模塊機(jī)制,將會(huì)在以后逐漸被應(yīng)用起來乏盐。
Typescrit的模塊機(jī)制與es6的模塊基本類似佳窑。模塊是指在其自身作用域里執(zhí)行制恍,而不是在全局作用域里父能;模塊間是依靠 export
和 import
建立關(guān)系。編譯器在編譯過程中净神,也是依賴這種關(guān)系來定位需要編譯的文件何吝。
TypeScript 依然還是以 JavaScript 文件的形式發(fā)布類庫,這會(huì)導(dǎo)致類型無法表述鹃唯,需要配合聲明文件對(duì)其進(jìn)行類型描述爱榕;因此聲明文件成了類庫一個(gè)必不可少的組成部分。
二坡慌、分類
Angular 使用 TypeScript 語言開發(fā)黔酥,要想讓一個(gè)類庫被運(yùn)用,最重要的是看有沒有聲明文件。
有聲明文件
要分清類庫是否有聲明文件 *.d.ts
跪者,可以從兩個(gè)方面來確認(rèn)這件事:
1棵帽、類庫自帶
從 Npm 安裝一個(gè)依賴包后,可以直接檢查其庫的 package.json
是否包含 typings
節(jié)點(diǎn)渣玲,例如 moment
:
"typings": "./moment.d.ts"
2逗概、TypeSearch檢索
TypeScript 提供了一個(gè)叫 TypeSearch 網(wǎng)站,可以直接輸入關(guān)鍵詞檢查是否包含該類庫的聲明文件忘衍。
例如 lodash
可以在列表中點(diǎn)擊會(huì)跳轉(zhuǎn)至 npm 網(wǎng)站逾苫,并且會(huì)看到這樣的一個(gè)命令:
npm install --save @types/lodash
無聲明文件
這類情況還蠻常見,這種情況下只能自行編寫聲明文件枚钓。
Angular Cli 創(chuàng)建的項(xiàng)目會(huì)包含一個(gè) src/typings.d.ts
聲明文件铅搓,它會(huì)自動(dòng)包含在全局聲明定義中,而把這些類庫的聲明信息寫在這里面再好不過搀捷。
一般而言自己很難對(duì)一個(gè)類庫寫一個(gè)完整的聲明文件狸吞,這對(duì)于成本來說太不合算,因此往往都是只對(duì)部分全局對(duì)象做一個(gè) any
(表示忽略該靜態(tài)類型檢查)亦可指煎,例如:
// src/typings.d.ts
declare var $: any;
declare var jQuery: any;
三蹋偏、如何使用?
有聲明文件
對(duì)于有聲明文件至壤,無需額外做什么威始,只需在需要模塊的地方使用 import
來導(dǎo)入即可,例如:
import * as moment from 'moment';
moment(); // 當(dāng)前時(shí)間
無聲明文件
重要來看無聲明文件時(shí)怎么做像街,前面說到使用 any
來表示忽略靜態(tài)類型檢查黎棠,意味者無法享受聲明文件帶來的智能提示快感。
// app.component.ts
const g2 = new G2();
g2. // 輸入 `.` 后是不會(huì)有任何方法或?qū)傩?
除此之外 TypeScript 編譯過程中也不會(huì)對(duì) jquery
做任何類型檢查镰绎,jquery
是否真的存在只能由自己把握脓斩。對(duì)于 Angular 而言,是需要額外在 .angular-cli.json
的 scripts
節(jié)點(diǎn)上明確加載這些模塊畴栖。
// .angular-cli.json
"scripts": [
"../node_modules/jquery/dist/jquery.min.js"
]
TypeScript 編譯后依然還是 JavaScript 代碼随静,假如不手動(dòng)加載 jquery
相關(guān) JavaScript 文件,自然在運(yùn)行過程中會(huì)提供未找到 jquery
的錯(cuò)誤吗讶。