Skip to content

类型推论和联合类型

类型推论

如果没有明确的指定类型,那么TypeScript会依照类型推论(Type Inference)的规则推断出一个类型。

什么是类型推论

以下代码虽然没有指定类型,但是会在编译的时候报错:

    let myFavoriteNumber = 'seven';
    myFavoriteNumber = 7; // 不能将类型"7"分配给类型"string"。

事实上,他等价于

    let myFavoriteNumber:string = 'seven';
    myFavoriteNumber = 7; // 不能将类型"7"分配给类型"string"。

TypeScript 会在没有明确指定类型的时候推测出一个类型,这就是类型推论。

即: 如果在定义的时候有赋值,根据赋值的类型推测出一个类型; 如果在定义的时候没有复制,就推断成any类型。

联合类型

联合类型(Union Types)表示取值为多种类型中的一种。

    let myFavoriteNumber: string | number;
    myFavoriteNumber = 7;
    myFavoriteNumber = 'seven';
    myFavoriteNumber = true; // 不能将类型"true"分配给类型"string | number"。

联合类型使用|分隔每个类型,表示允许为类型1或者类型2...。

访问联合类型的属性或方法

当TypeScript不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型的共有的属性和方法。

    function getLength(something: string | number): number {
        return something.length
    }
    // 类型"string | number"上不存在属性"length"。
    //   类型"number"上不存在属性"length"。

访问toString()方法是可以的,但是返回值是需要改成string:

    function getLength(something: string | number): string {
        return something.toString()
    }

联合类型的类型推论:

    let myFavoriteNumber : string | number;
    myFavoriteNumber = 'seven'; // 此时类型推断为 `string`
    myFavoriteNumber.length;
    myFavoriteNumber = 7;
    // myFavoriteNumber.length; // myFavoriteNumber: number

所以联合类型的赋值,在允许的类型中会切换变量的类型,并在每个状态下可以单独该类型的独有的方法。