这节主要讨论类型推导 (where and how types are inferred)
Basics
let x = 3;
像上面这样, 变量 x 被初始化为 3, 那么 x 的类型会被推断为 number
这种情况下是很自然的, 类似的情况还有设定函数的默认参数, 决定函数返回值的时候
Best common type
let x = [0, 1, null];
上面的变量 x 是一个 Array, 它的成员的类型有 number
和 null
The best common type algorithm considers each candidate type, and picks the type that is compatible with all the other candidates
所以 x 的类型是 number
(因为 null 是其他类型的子类型)
有时候, 成员 share a common structure, 但是找不出一种类型来 compatible with all cadidate types:
let zoo = [new Rhino(), new Elephant(), new Snake()];
所以, 这种情况需要你显示地对类型进行标注
let zoo: Animal[] = [new Rhino(), new Elephant(), new Snake()];
最后如果你不标注的话, 那么 ts 会藏 zoo 的类型 fallback 到一个 union type, (Rhino | Elephant | Snake)[]
Contexual Type
根据上下文进行推导
// 依靠了 window.onmousedown 来确定 mouseEvent 的类型
window.onmousedown = function(mouseEvent) {
console.log(mouseEvent.clickTime); //<- Error
};
// 可以强制覆盖
window.onmousedown = function(mouseEvent: any) {
console.log(mouseEvent.clickTime); //<- Now, no error is given
};