类型推导

    TypeScript中,有许多没有明确类型声明的地方,其实都可以将类型推导出来,例如:

    x变量的类型可以推导为number。当初始化变量,成员,设置默认参数,或定义函数返回值类型时,这类推导就会发生。

    大多数情况下,类型推导都是很直接的。在下文中,我们将探索不同推导间的细微差别。

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

    为了推导出上述x变量的类型,我们必须考虑数组内的每一个元素。数组中有两个类型:numbernull

    因为“最好的通用类型”原则,所有必须拥有它们共有的结构,但是它们之间并没有共同的超类。另一个例子:

    理想情况下,我们希望的类型为Animal[],所以我们可以明确地指定这个类型,当其中没有一个元素的类型是其他两个的超集时:

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

    TypeScript中,还有另一个方向的类型推导,它被称为“上下文类型”。上下文类型在表达式所处的位置可以被隐式推导类型时发生。例子:

    上述的代码会得到了一个类型错误。但当TypeScript使用Window.onmousedown函数的类型,来推导等号右边的类型时,它就能够推导出mouseEvent参数的类型,因此就会得到一个错误。但是如果该函数表达式没有在一个特定的上下文位置,那么将是any类型,不会得到报错。

    如果明确地指定了参数的类型,那么上下文类型将被忽略:

    1. console.log(mouseEvent.buton); //<- Now, no error is given
    2. };

    上面的例子里,最好的通用类型有四个候选:AnimalRhinoElephant和。这些之中,Animal会成为“最好的通用类型”原则下最后的胜者。