鍍金池/ 教程/ HTML/ 介紹
初始化項(xiàng)目結(jié)構(gòu)
聯(lián)合類型
介紹
介紹
介紹
編譯選項(xiàng)
TypeScript 1.6
介紹
介紹
發(fā)展路線圖
介紹
在MSBuild里使用編譯選項(xiàng)
可迭代性
TypeScript 1.3
介紹
介紹
TypeScript 1.1
變量聲明
即將到來(lái)的Angular 2框架是使用TypeScript開發(fā)的。 因此Angular和TypeScript一起使用非常簡(jiǎn)單方便
tsconfig.json
介紹
介紹
介紹
在MSBuild里使用編譯選項(xiàng)
使用TypeScript的每日構(gòu)建版本
新建工程
枚舉
三斜線指令
結(jié)合ASP.NET v5使用TypeScript
TypeScript里的this
介紹
TypeScript 1.4
編碼規(guī)范
介紹
模塊解析
ASP.NET 4
架構(gòu)概述
介紹
介紹
ASP.NET Core
TypeScript 1.8
介紹
介紹
創(chuàng)建簡(jiǎn)單工程
TypeScript 1.7
TypeScript 1.5
NPM包的類型
支持TypeScript的編輯器

介紹

這節(jié)介紹TypeScript里的類型推論。即,類型是在哪里如何被推斷的。

基礎(chǔ)

TypeScript里,在有些沒(méi)有明確指出類型的地方,類型推論會(huì)幫助提供類型。如下面的例子

let x = 3;

變量x的類型被推斷為數(shù)字。 這種推斷發(fā)生在初始化變量和成員,設(shè)置默認(rèn)參數(shù)值和決定函數(shù)返回值時(shí)。

大多數(shù)情況下,類型推論是直截了當(dāng)?shù)亍?后面的小節(jié),我們會(huì)瀏覽類型推論時(shí)的細(xì)微差別。

最佳通用類型

當(dāng)需要從幾個(gè)表達(dá)式中推斷類型時(shí)候,會(huì)使用這些表達(dá)式的類型來(lái)推斷出一個(gè)最合適的通用類型。例如,

let x = [0, 1, null];

為了推斷x的類型,我們必須考慮所有元素的類型。 這里有兩種選擇:numbernull。 計(jì)算通用類型算法會(huì)考慮所有的候選類型,并給出一個(gè)兼容所有候選類型的類型。

由于最終的通用類型取自候選類型,有些時(shí)候候選類型共享相同的通用類型,但是卻沒(méi)有一個(gè)類型能做為所有候選類型的類型。例如:

let zoo = [new Rhino(), new Elephant(), new Snake()];

這里,我們想讓zoo被推斷為Animal[]類型,但是這個(gè)數(shù)組里沒(méi)有對(duì)象是Animal類型的,因此不能推斷出這個(gè)結(jié)果。 為了更正,當(dāng)候選類型不能使用的時(shí)候我們需要明確的指出類型:

let zoo: Animal[] = [new Rhino(), new Elephant(), new Snake()];

如果沒(méi)有找到最佳通用類型的話,類型推論的結(jié)果是空對(duì)象類型,{}。 因?yàn)檫@個(gè)類型沒(méi)有任何成員,所以訪問(wèn)其成員的時(shí)候會(huì)報(bào)錯(cuò)。

上下文類型

TypeScript類型推論也可能按照相反的方向進(jìn)行。 這被叫做“按上下文歸類”。按上下文歸類會(huì)發(fā)生在表達(dá)式的類型與所處的位置相關(guān)時(shí)。比如:

window.onmousedown = function(mouseEvent) {
    console.log(mouseEvent.buton);  //<- Error
};

這個(gè)例子會(huì)得到一個(gè)類型錯(cuò)誤,TypeScript類型檢查器使用Window.onmousedown函數(shù)的類型來(lái)推斷右邊函數(shù)表達(dá)式的類型。 因此,就能推斷出mouseEvent參數(shù)的類型了。 如果函數(shù)表達(dá)式不是在上下文類型的位置,mouseEvent參數(shù)的類型需要指定為any,這樣也不會(huì)報(bào)錯(cuò)了。

如果上下文類型表達(dá)式包含了明確的類型信息,上下文的類型被忽略。 重寫上面的例子:

window.onmousedown = function(mouseEvent: any) {
    console.log(mouseEvent.buton);  //<- Now, no error is given
};

這個(gè)函數(shù)表達(dá)式有明確的參數(shù)類型注解,上下文類型被忽略。 這樣的話就不報(bào)錯(cuò)了,因?yàn)檫@里不會(huì)使用到上下文類型。

上下文歸類會(huì)在很多情況下使用到。 通常包含函數(shù)的參數(shù),賦值表達(dá)式的右邊,類型斷言,對(duì)象成員和數(shù)組字面量和返回值語(yǔ)句。 上下文類型也會(huì)做為最佳通用類型的候選類型。比如:

function createZoo(): Animal[] {
    return [new Rhino(), new Elephant(), new Snake()];
}

這個(gè)例子里,最佳通用類型有4個(gè)候選者:Animal,Rhino,ElephantSnake。 當(dāng)然,Animal會(huì)被做為最佳通用類型。

上一篇:tsconfig.json下一篇:TypeScript 1.7