使用 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 的時候,你可以訪問鼠標事件對象的所有屬性和方法,當訪問不存在屬性的時候,就會報錯。