1 任意类型 Any

如果一个普通类型的变量在赋值过程中改变变量类型是不允许的,任意类型 ( **: any** ) 表示变量可以被任意赋值且不限制类型。如:

  1. let myFavoriteNumber: string = "seven";
  2. // ERROR: 不能将类型“number”分配给类型“string”。
  3. myFavoriteNumber = 7;

改为任意类型 ( : any ) 后

  1. let myFavoriteNumber: any = "seven";
  2. myFavoriteNumber = 7; // OK
  • 任意类型 ( **: any** ) 上访问任何属性都是允许的,可以认为一个变量被声明为任意类型后,对它的任何操作,返回的内容也都是任意类型。如

    1. let anyThing: any = "anything";
    2. anyThing.type = "any";
    3. anyThing.getType = () => {
    4. return "any";
    5. }
    6. anyThing.setName('Jerry');

    ❗注:当然这只是值编译时不会抛出异常,实际运行时是否报错取决于有无该属性。

  • 一个变量在被声明时未指定其类型(及初始值),那么它会被识别为任意类型 ( **: any** ) 。如

    1. let myVariable;
    2. myVariable = "any"; // OK
    3. myVariable = 7; // OK

    2 类型推论

    如果一个变量在声明时未指定其类型,但赋予了初始值,那么它的类型会被自动推测为初始值的类型,这个过程叫类型推论。如

    1. let myVariable = "seven"; // 有初始值,被推论为 :string 类型
    2. // ERROR: 不能将类型“number”分配给类型“string”。
    3. myVariable = 7;

    注意与识别为任意类型 ( : any ) 时区分。

    3 联合类型

    联合类型 (Union Types) 表示变量的取值类型为多种给定类型中的一种。格式: t1 | t2

    1. let myVariable: string | number;
    2. myVariable = "seven"; // OK
    3. myVariable = 7; // OK
    4. // ERROR: 不能将类型“boolean”分配给类型“string | number”。
    5. myVariable = true;
  • 在联合类型的变量还未被确定为一准确类型变量时,只能访问其类型的共有属性和方法

    1. myVariable.toString(); // OK
    2. // ERROR: 类型“string | number”上不存在属性“length”。类型“number”上不存在属性“length”。
    3. myVariable.length;
  • 联合类型的变量被赋值成功后,会被类型推论为一个准确的类型,之后只能访问它含有的方法。

    1. myVariable = "string"; // 重新赋值,改变类型 :string
    2. myVariable.length; // OK