乐趣区

TypeScript-初识-类型推论

基础

定义一个变量的时候,如果没有指定明确的类型,TypeScript 会根据赋的值推断出变量的类型:

let x = 3;
// Error, Type 'string' is not assignable to type 'number'.
x = '3';

如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成 any 类型而完全不被类型检查:

let myFavoriteNumber;
myFavoriteNumber = 'seven';
myFavoriteNumber = 7;

最佳通用类型

当需要从几个表达式中推断类型时候,会使用这些表达式的类型来推断出一个最合适的通用类型:

const x = [0, 1, null];

首先会判断出 x 是一个数组,然后根据数组里的所有内容判断 x 最佳匹配类型:(number | null)[]

上下文类型

TypeScript 不止会根据赋的值进行类型推论,还会根据变量所在位置的上下文进行推论:

window.onmousedown = function(mouseEvent) {
    // Error
    console.log(mouseEvent.button);
};

function(mouseEvent) {
    // 编译通过
    console.log(mouseEvent.button);
};

TypeScript 类型检查器使用 Window.onmousedown 函数的类型来推断右边函数表达式的类型。因此,就能推断出 mouseEvent 参数的类型了。如果函数表达式不是在上下文类型的位置,mouseEvent 参数的类型需要指定为 any,这样也不会报错了。

如果上下文类型表达式包含了明确的类型信息,上下文的类型会被忽略。重写上面的例子:

window.onmousedown = function(mouseEvent: any) {
    // 编译通过
    console.log(mouseEvent.button);
};

上下文归类会在很多情况下使用到。通常包含函数的参数,赋值表达式的右边,类型断言,对象成员和数组字面量和返回值语句。上下文类型也会做为最佳通用类型的候选类型。比如:

function createZoo(): Animal[] {return [new Rhino(), new Elephant(), new Snake()];
}

这个例子里,最佳通用类型有 4 个候选者:AnimalRhinoElephantSnake。当然,Animal 会被做为最佳通用类型。

退出移动版