W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
這節(jié)介紹TypeScript里的類型推論。即,類型是在哪里如何被推斷的。
TypeScript里,在有些沒有明確指出類型的地方,類型推論會幫助提供類型。如下面的例子
let x = 3;
變量x
的類型被推斷為數字。 這種推斷發(fā)生在初始化變量和成員,設置默認參數值和決定函數返回值時。
大多數情況下,類型推論是直截了當地。 后面的小節(jié),我們會瀏覽類型推論時的細微差別。
當需要從幾個表達式中推斷類型時候,會使用這些表達式的類型來推斷出一個最合適的通用類型。例如,
let x = [0, 1, null];
為了推斷x
的類型,我們必須考慮所有元素的類型。 這里有兩種選擇: number
和null
。 計算通用類型算法會考慮所有的候選類型,并給出一個兼容所有候選類型的類型。
由于最終的通用類型取自候選類型,有些時候候選類型共享相同的通用類型,但是卻沒有一個類型能做為所有候選類型的類型。例如:
let zoo = [new Rhino(), new Elephant(), new Snake()];
這里,我們想讓zoo被推斷為Animal[]
類型,但是這個數組里沒有對象是Animal
類型的,因此不能推斷出這個結果。 為了更正,當候選類型不能使用的時候我們需要明確的指出類型:
let zoo: Animal[] = [new Rhino(), new Elephant(), new Snake()];
如果沒有找到最佳通用類型的話,類型推論的結果是空對象類型,{}
。 因為這個類型沒有任何成員,所以訪問其成員的時候會報錯。
TypeScript類型推論也可能按照相反的方向進行。 這被叫做“按上下文歸類”。按上下文歸類會發(fā)生在表達式的類型與所處的位置相關時。比如:
window.onmousedown = function(mouseEvent) {
console.log(mouseEvent.buton); //<- Error
};
這個例子會得到一個類型錯誤,TypeScript類型檢查器使用Window.onmousedown
函數的類型來推斷右邊函數表達式的類型。 因此,就能推斷出 mouseEvent
參數的類型了。 如果函數表達式不是在上下文類型的位置,mouseEvent
參數的類型需要指定為any
,這樣也不會報錯了。
如果上下文類型表達式包含了明確的類型信息,上下文的類型被忽略。 重寫上面的例子:
window.onmousedown = function(mouseEvent: any) {
console.log(mouseEvent.buton); //<- Now, no error is given
};
這個函數表達式有明確的參數類型注解,上下文類型被忽略。 這樣的話就不報錯了,因為這里不會使用到上下文類型。
上下文歸類會在很多情況下使用到。 通常包含函數的參數,賦值表達式的右邊,類型斷言,對象成員和數組字面量和返回值語句。 上下文類型也會做為最佳通用類型的候選類型。比如:
function createZoo(): Animal[] {
return [new Rhino(), new Elephant(), new Snake()];
}
這個例子里,最佳通用類型有4個候選者:Animal
,Rhino
,Elephant
和Snake
。 當然, Animal
會被做為最佳通用類型。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯系方式:
更多建議: