TypeScript基礎(chǔ)入門 - 類型推論

轉(zhuǎn)發(fā)

TypeScript基礎(chǔ)入門 - 類型推論

介紹

本次分享介紹TypeScript里的類型推論。即,類型是在哪里如何被推斷的。

基礎(chǔ)

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

let x = 3;

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

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

最佳通用類型

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

let x = [0, 1, null];

為了推斷x的類型,我們必須考慮所有元素的類型。 這里有兩種選擇: number和null。 計算通用類型算法會考慮所有的候選類型,并給出一個兼容所有候選類型的類型。

由于最終的通用類型取自候選類型,有些時候候選類型共享相同的通用類型,但是卻沒有一個類型能做為所有候選類型的類型。例如:

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

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

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

如果沒有找到最佳通用類型的話,類型推斷的結(jié)果為聯(lián)合數(shù)組類型,(Rhino | Elephant | Snake)[]

上下文類型

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

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

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

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

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

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

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

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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