新聞中心
這節(jié)介紹TypeScript里的類(lèi)型推論。即,類(lèi)型是在哪里如何被推斷的。

基礎(chǔ)
TypeScript里,在有些沒(méi)有明確指出類(lèi)型的地方,類(lèi)型推論會(huì)幫助提供類(lèi)型。如下面的例子
let x = 3;
變量x的類(lèi)型被推斷為數(shù)字。 這種推斷發(fā)生在初始化變量和成員,設(shè)置默認(rèn)參數(shù)值和決定函數(shù)返回值時(shí)。
大多數(shù)情況下,類(lèi)型推論是直截了當(dāng)?shù)亍?后面的小節(jié),我們會(huì)瀏覽類(lèi)型推論時(shí)的細(xì)微差別。
最佳通用類(lèi)型
當(dāng)需要從幾個(gè)表達(dá)式中推斷類(lèi)型時(shí)候,會(huì)使用這些表達(dá)式的類(lèi)型來(lái)推斷出一個(gè)最合適的通用類(lèi)型。例如,
let x = [0, 1, null];
為了推斷x的類(lèi)型,我們必須考慮所有元素的類(lèi)型。 這里有兩種選擇: number和null。 計(jì)算通用類(lèi)型算法會(huì)考慮所有的候選類(lèi)型,并給出一個(gè)兼容所有候選類(lèi)型的類(lèi)型。
由于最終的通用類(lèi)型取自候選類(lèi)型,有些時(shí)候候選類(lèi)型共享相同的通用類(lèi)型,但是卻沒(méi)有一個(gè)類(lèi)型能做為所有候選類(lèi)型的類(lèi)型。例如:
let zoo = [new Rhino(), new Elephant(), new Snake()];
這里,我們想讓zoo被推斷為Animal[]類(lèi)型,但是這個(gè)數(shù)組里沒(méi)有對(duì)象是Animal類(lèi)型的,因此不能推斷出這個(gè)結(jié)果。 為了更正,當(dāng)候選類(lèi)型不能使用的時(shí)候我們需要明確的指出類(lèi)型:
let zoo: Animal[] = [new Rhino(), new Elephant(), new Snake()];
如果沒(méi)有找到最佳通用類(lèi)型的話,類(lèi)型推論的結(jié)果是空對(duì)象類(lèi)型,{}。 因?yàn)檫@個(gè)類(lèi)型沒(méi)有任何成員,所以訪問(wèn)其成員的時(shí)候會(huì)報(bào)錯(cuò)。
上下文類(lèi)型
TypeScript類(lèi)型推論也可能按照相反的方向進(jìn)行。 這被叫做“按上下文歸類(lèi)”。按上下文歸類(lèi)會(huì)發(fā)生在表達(dá)式的類(lèi)型與所處的位置相關(guān)時(shí)。比如:
window.onmousedown = function(mouseEvent) {
console.log(mouseEvent.buton); //<- Error
};
這個(gè)例子會(huì)得到一個(gè)類(lèi)型錯(cuò)誤,TypeScript類(lèi)型檢查器使用Window.onmousedown函數(shù)的類(lèi)型來(lái)推斷右邊函數(shù)表達(dá)式的類(lèi)型。 因此,就能推斷出 mouseEvent參數(shù)的類(lèi)型了。 如果函數(shù)表達(dá)式不是在上下文類(lèi)型的位置,mouseEvent參數(shù)的類(lèi)型需要指定為any,這樣也不會(huì)報(bào)錯(cuò)了。
如果上下文類(lèi)型表達(dá)式包含了明確的類(lèi)型信息,上下文的類(lèi)型被忽略。 重寫(xiě)上面的例子:
window.onmousedown = function(mouseEvent: any) {
console.log(mouseEvent.buton); //<- Now, no error is given
};
這個(gè)函數(shù)表達(dá)式有明確的參數(shù)類(lèi)型注解,上下文類(lèi)型被忽略。 這樣的話就不報(bào)錯(cuò)了,因?yàn)檫@里不會(huì)使用到上下文類(lèi)型。
上下文歸類(lèi)會(huì)在很多情況下使用到。 通常包含函數(shù)的參數(shù),賦值表達(dá)式的右邊,類(lèi)型斷言,對(duì)象成員和數(shù)組字面量和返回值語(yǔ)句。 上下文類(lèi)型也會(huì)做為最佳通用類(lèi)型的候選類(lèi)型。比如:
function createZoo(): Animal[] {
return [new Rhino(), new Elephant(), new Snake()];
}
這個(gè)例子里,最佳通用類(lèi)型有4個(gè)候選者:Animal,Rhino,Elephant和Snake。 當(dāng)然, Animal會(huì)被做為最佳通用類(lèi)型。
本文名稱(chēng):創(chuàng)新互聯(lián)TypeScript教程:TypeScript類(lèi)型推論
新聞來(lái)源:http://m.5511xx.com/article/cogjgch.html


咨詢(xún)
建站咨詢(xún)
