使用 typescript 時,在一些定義中如果你沒有明确識指定類型,編譯器會自動推斷出合适的類型,比如:
let str = 'hello'
str = 123 // error,不能将類型“123”配置設定給類型“string”
可以看到,定義變量 str 時并沒有指定它的類型,而是直接指派一個字元串,當再給它賦一個數值時就會報錯。這裡 typescript 就根據我們賦給 str 的值的類型,推斷出我們的 str 的類型,是字元串類型,是以不可以将數值類型賦給它。
這個就是最基本的類型推論,根據右側的值推斷左側變量的類型。
多類型聯合
當我們定義一個數組或者元組這種包含多個元素的值的時候,多個元素可以有不同的類型,這時候 typescript 會将多個類型合并起來,組成一個聯合類型,例如:
const arr = [1, 'a']
arr.push(false) // error,類型“false”的參數不能賦給類型“string | number”的參數
此時的 arr 的元素被推斷為 string | number,也就是元素可以是 string 類型也可以是 number 類型,除此之外的類型是不可以的。再一個例子:
let value = Math.random() * 10 > 5 ? 123 : 'abc'
value = false // error,不能将類型“false”配置設定給類型“string | number”。
value 的值是随機的,但是隻能是 string 或者 number,它的類型被推斷出是 string | number,是以不能指派 false。
上下文類型
前面講的例子都是根據 = 符号右邊值的類型,推斷出左側變量的類型。現在還有一種是根據左側的類型推斷右側的類型,這就是上下文類型。官網的例子:
window.onmousedown = function(mouseEvent) {
console.log(mouseEvent.button); // error,mouseEvent 上不存在屬性 button
};
表達式左側是 window.onmousedown (滑鼠按下時發生事件),是以 TypeScript 會推斷指派表達式右側函數的參數是事件對象,且是 MouseEvent。在回調函數中使用 mouseEvent 的時候,你可以通路滑鼠事件對象的所有屬性和方法,當通路不存在屬性的時候,就會報錯。