这节主要讨论类型推导 (where and how types are inferred)

Basics

  1. let x = 3;

像上面这样, 变量 x 被初始化为 3, 那么 x 的类型会被推断为 number
这种情况下是很自然的, 类似的情况还有设定函数的默认参数, 决定函数返回值的时候

Best common type

  1. let x = [0, 1, null];

上面的变量 x 是一个 Array, 它的成员的类型有 numbernull

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:

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

所以, 这种情况需要你显示地对类型进行标注

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

最后如果你不标注的话, 那么 ts 会藏 zoo 的类型 fallback 到一个 union type, (Rhino | Elephant | Snake)[]

Contexual Type

根据上下文进行推导

  1. // 依靠了 window.onmousedown 来确定 mouseEvent 的类型
  2. window.onmousedown = function(mouseEvent) {
  3. console.log(mouseEvent.clickTime); //<- Error
  4. };
  5. // 可以强制覆盖
  6. window.onmousedown = function(mouseEvent: any) {
  7. console.log(mouseEvent.clickTime); //<- Now, no error is given
  8. };