TypeScript入門(mén)

最近開(kāi)始嘗試在項(xiàng)目中使用Typescript, 簡(jiǎn)單來(lái)說(shuō),Typescript是一個(gè)JavaScript的超集(即支持JavaScript的全部語(yǔ)法棍郎,完全兼容),TS在JavaScript的基礎(chǔ)上增加了靜態(tài)類(lèi)型檢查和面向?qū)ο蟮奶匦浴?/p>

Typescript可以在編譯階段“降級(jí)”為ES5或ES3银室,以在瀏覽器中運(yùn)行涂佃,因此Typescript獲得了和JavaScript一樣的兼容性,可以在全部的現(xiàn)代瀏覽器中運(yùn)行蜈敢。

npm是安裝TypeScript的最簡(jiǎn)潔的方式辜荠。npm install -g typescript即可全局安裝,不過(guò)我通常會(huì)選擇安裝在項(xiàng)目的依賴(lài)中抓狭。即npm install typescript伯病,然后通過(guò)node_modules/.bin/tsc來(lái)運(yùn)行Typescript的編譯器。

Hello World

Typescript的文件以ts結(jié)尾否过,我們首先來(lái)編寫(xiě)一個(gè)greeter.ts的文件午笛。內(nèi)容如下:

function greeter(person){
    return "Hello, "+person
}

let user = "World"

document.getElementById('app').innerHTML=greeter(user)

編寫(xiě)完ts文件之后,我們可以通過(guò)tsc greeter.ts來(lái)將ts文件轉(zhuǎn)換為以js為后綴的JavaScript文件苗桂。這樣药磺,就可以在我們的瀏覽器中運(yùn)行了。

所以煤伟,我們?cè)倬帉?xiě)一個(gè)對(duì)應(yīng)的html文件癌佩,內(nèi)容如下:

<html>
    <body>
        <div id="app"></div>
    </body>
    <footer>
        <script src="./greeter.js"></script>
    </footer>
</html>

在瀏覽器中打開(kāi)這個(gè)文件木缝,就可以看到 Hello World 在頁(yè)面上了。

類(lèi)型檢查

不難看出围辙,我們希望在greeter函數(shù)中我碟,接收一個(gè)字符串來(lái)作為參數(shù)。如果我們?cè)贘avaScript中傳入一個(gè)非字符串函數(shù)姚建,會(huì)怎么樣呢矫俺?例如,修改剛剛得到的js文件桥胞,我們傳入一個(gè)空的對(duì)象:

function greeter(person) {
    return "Hello, " + person;
}
var user = {};
document.getElementById('app').innerHTML = greeter(user);

我們會(huì)看到恳守,頁(yè)面上的文字變成了Hello, [object Object]。這不是我們想要的贩虾。我們不希望其他的開(kāi)發(fā)者在調(diào)用這個(gè)函數(shù)時(shí)催烘,傳入非字符串的函數(shù)。因此缎罢,我們要檢查一下這個(gè)類(lèi)型伊群。因此,我們將ts文件修改為:

function greeter(person:string){
    return "Hello, "+person
}
var user = {}
document.getElementById('app').innerHTML=greeter(user)

此時(shí)我們也試圖傳入一個(gè)空的對(duì)象策精,重新運(yùn)行tsc greeter.ts舰始,我們會(huì)得到下面的信息:

tsfailed.jpeg

error TS2345: Argument of type '{}' is not assignable to parameter of type 'string'.

Typescript在編譯這個(gè)文件給出了報(bào)錯(cuò),原因是'string類(lèi)型的參數(shù)不能接受{}這個(gè)對(duì)象'咽袜,在編譯階段就將我們的想法拒之于門(mén)外丸卷。與傳入?yún)?shù)類(lèi)似,方法的返回值也可以指定類(lèi)型:

function greeter(person:string): string {
    return {}
}

var user = {}

document.getElementById('app').innerHTML=greeter(user)

編譯器同樣會(huì)告訴我們:Type '{}' is not assignable to type 'string'.

值得注意的是询刹,雖然編譯器報(bào)了error谜嫉,但是依然會(huì)生成對(duì)應(yīng)的js文件。但它可能不會(huì)按預(yù)期的執(zhí)行凹联。

在較為大型的項(xiàng)目中沐兰,我們可能一不留神就將一個(gè)空的對(duì)象傳入了類(lèi)似的函數(shù),有了靜態(tài)檢查之后蔽挠,我們可以極大地避免這類(lèi)問(wèn)題住闯,讓我們的程序更加穩(wěn)定“氖纾可以說(shuō)比原,靜態(tài)檢查是一個(gè)非常必要的特性了。

接口和類(lèi)

像鴨子一樣走路并且嘎嘎叫的就叫鴨子杠巡。
-- James Whitecomb Riley

不妨設(shè)想一個(gè)問(wèn)題春寿,如果有很多不同類(lèi)型的對(duì)象,如Duck, Chicken, Fish等等忽孽,我們不能使用object來(lái)分辨他們(因?yàn)槎际莖bject)绑改,這時(shí)候就可以使用接口或者類(lèi)谢床。Typescript使用鴨式辨型法,我們可以編寫(xiě)不同類(lèi)型的接口厘线,制定不同類(lèi)型動(dòng)物的規(guī)則來(lái)分辨他們识腿,如:

interface Duck {
    isDuck:boolean,
    name:string
}
interface Chicken {
    isChicken:boolean
}
function greeter(duck:Duck) {
    return "This is a Duck, whose name is "+duck.name
}
var duck = {isDuck:true,name:"Donald"}
document.getElementById('app').innerHTML=greeter(duck)

這樣,我們就可以限定傳入greeter方法的參數(shù)造壮,必須“實(shí)現(xiàn)”了Duck接口的內(nèi)容渡讼,這里的實(shí)現(xiàn)只是形式上的實(shí)現(xiàn),換句話說(shuō)耳璧,只要有isDuck和name屬性的對(duì)象成箫,就會(huì)被認(rèn)為是一個(gè)實(shí)現(xiàn)了Duck接口的對(duì)象。就是開(kāi)頭的那句話旨枯,“像鴨子一樣走路并且嘎嘎叫的就叫鴨子”

不是所有的屬性都是必須的蹬昌,我們可以用“?”來(lái)標(biāo)記一個(gè)可選的屬性,如:

interface Duck {
    isDuck:boolean,
    name:string,
    color?:string
}

這樣攀隔,無(wú)論有沒(méi)有color屬性皂贩,都會(huì)被認(rèn)為是一個(gè)“實(shí)現(xiàn)”了Duck接口的類(lèi)。

如果我們想要在創(chuàng)建完這個(gè)對(duì)象之后昆汹,就再也不修改它的一些屬性明刷,如isDuck,它應(yīng)該是一個(gè)只讀的屬性满粗。我們可以用readonly來(lái)標(biāo)記辈末。如下:

interface Duck {
    readonly isDuck:boolean,
    name:string,
    color?:string
}

readonly和const的區(qū)別:readonly標(biāo)記的是屬性,而const所聲明的是一個(gè)變量映皆。

除接口之外挤聘,Typescript也支持面向?qū)ο蟮木幊獭_@是一個(gè)ES6的新特性劫扒,從ES6開(kāi)始檬洞,JavaScript也開(kāi)始支持面向?qū)ο缶幊塘恕?/p>

class Duck {
    name:string
    constructor(name:string){
        this.name = name
    }
    greet():string{
        return "Hello, "+this.name
    }
}

var duck = new Duck("Donald");
document.getElementById("app").innerHTML = duck.greet()

上面的代碼創(chuàng)建了一個(gè)Duck類(lèi),其中包含了一個(gè)name屬性狸膏,一個(gè)構(gòu)造函數(shù)沟饥,和一個(gè)返回字符串的greet函數(shù)。我們可以通過(guò)new這一關(guān)鍵字來(lái)創(chuàng)建一個(gè)Duck類(lèi)的對(duì)象湾戳。并調(diào)用其函數(shù)贤旷。在greet函數(shù)中,我們使用this來(lái)引用類(lèi)成員砾脑。

在Typescript中幼驶,成員變量是默認(rèn)為public的,即可以在類(lèi)的外部調(diào)用韧衣,我們可以用private來(lái)將其限制在類(lèi)內(nèi)部訪問(wèn)盅藻,

類(lèi)似于接口中购桑,我們也可以使用readonly來(lái)將屬性設(shè)置為只讀。 只讀屬性必須在聲明時(shí)或構(gòu)造函數(shù)里被初始化氏淑。

面向?qū)ο笾辛硪粋€(gè)很重要的特性是繼承勃蜘,我們可以使用extends來(lái)實(shí)現(xiàn)繼承。

class Animal {
    protected name:string
    constructor(name:string){
        this.name = name
    }
    greet():string{
        return "Hello "+this.name
    }
}

class Duck extends Animal {
    greet():string{
        return "Hello, this is a Duck, whose name is "+this.name
    }
}

var duck = new Duck("Donald");
var animal = new Animal("Mickey")
document.getElementById("app").innerHTML = duck.greet()
document.getElementById("app").innerHTML = document.getElementById("app").innerHTML+' '+animal.greet()

這樣假残,我們的Duck就繼承了Animal中的name屬性和contructor方法缭贡,注意,我們?cè)谶@里使用protected屬性辉懒,以使得name這一屬性能夠在Duck子類(lèi)中使用阳惹。

工程配置

在項(xiàng)目的目錄下,可以使用tsconfig.json這一文件來(lái)指定編譯時(shí)的屬性眶俩。如果我們直接在項(xiàng)目目錄下執(zhí)行tsc莹汤,Typescript解釋器就會(huì)在當(dāng)前目錄尋找tsconfig.json這一文件,如果當(dāng)前項(xiàng)目目錄沒(méi)有仿便,就會(huì)逐級(jí)向上尋找体啰。我們也可以使用--project-p來(lái)指定項(xiàng)目目錄。

{
    "compilerOptions": {
        "module": "commonjs",
        "noImplicitAny": true,
        "removeComments": true,
        "preserveConstEnums": true,
        "sourceMap": true
    },
    "files": [
        "ducks.ts"
    ]
}

上面是一個(gè)tsconfig.json文件的示例嗽仪,全部的編譯器選項(xiàng)可以在編譯選項(xiàng)里看到荒勇。

"files"指定一個(gè)包含相對(duì)或絕對(duì)文件路徑的列表。 我們可以用"include"和"exclude"屬性指定一個(gè)文件glob匹配模式列表闻坚,如:

    "include": [
        "src/**/*"
    ],
    "exclude": [
        "node_modules",
        "**/*.spec.ts"
    ]

Vue/Angular的結(jié)合

很多較大型的Web框架都被Typescript所支持沽翔,Angular 2已經(jīng)整個(gè)項(xiàng)目都可以用Typescript來(lái)完成了。Vue 2.5也大大增強(qiáng)了對(duì)Typescript的支持窿凤。我們可以在快速起步里看到官方完成的各種起步模板仅偎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市雳殊,隨后出現(xiàn)的幾起案子橘沥,更是在濱河造成了極大的恐慌,老刑警劉巖夯秃,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件座咆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡仓洼,警方通過(guò)查閱死者的電腦和手機(jī)介陶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)色建,“玉大人哺呜,你說(shuō)我怎么就攤上這事』粒” “怎么了某残?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵国撵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我玻墅,道長(zhǎng)卸留,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任椭豫,我火速辦了婚禮耻瑟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赏酥。我一直安慰自己喳整,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布裸扶。 她就那樣靜靜地躺著框都,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呵晨。 梳的紋絲不亂的頭發(fā)上魏保,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音摸屠,去河邊找鬼谓罗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛季二,可吹牛的內(nèi)容都是我干的檩咱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼胯舷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼刻蚯!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起桑嘶,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炊汹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后逃顶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體讨便,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年口蝠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了器钟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片津坑。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妙蔗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疆瑰,到底是詐尸還是另有隱情眉反,我是刑警寧澤昙啄,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站寸五,受9級(jí)特大地震影響梳凛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梳杏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一韧拒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧十性,春花似錦叛溢、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至霞势,卻和暖如春烹植,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背愕贡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工草雕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人固以。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓促绵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嘴纺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子败晴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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

  • 概述 TypeScript本質(zhì)上是向JavaScript語(yǔ)言添加了可選的靜態(tài)類(lèi)型和基于類(lèi)的面向?qū)ο缶幊蹋瑫r(shí)也支持...
    oWSQo閱讀 8,512評(píng)論 1 45
  • 慕課網(wǎng)@JoJozhai 老師 TypeScript入門(mén)課程分享 TypeScript入門(mén) ES5,ES6,JS,...
    shangpudxd閱讀 10,432評(píng)論 0 22
  • TypeScript簡(jiǎn)介: 微軟開(kāi)發(fā) javascript的超集 遵循ES6腳本語(yǔ)言的規(guī)范 添加了遵循ES6的語(yǔ)...
    咖啡浮點(diǎn)閱讀 837評(píng)論 0 3
  • 一栽渴、什么是TypeScript尖坤? TypeScript 是微軟開(kāi)發(fā)一款開(kāi)源的編程語(yǔ)言,本質(zhì)上是向 JavaScri...
    ConRon閱讀 1,583評(píng)論 0 3
  • 1.認(rèn)識(shí)Ionic 2 如果您聽(tīng)說(shuō)過(guò)跨平臺(tái)開(kāi)發(fā)闲擦,那一定應(yīng)該聽(tīng)說(shuō)過(guò) PhoneGap 或 Cordova 慢味,這項(xiàng)技術(shù)...
    Clark_new閱讀 763評(píng)論 0 3