1 任意类型 Any
如果一个普通类型的变量在赋值过程中改变变量类型是不允许的,任意类型 ( **: any** ) 表示变量可以被任意赋值且不限制类型。如:
let myFavoriteNumber: string = "seven";// ERROR: 不能将类型“number”分配给类型“string”。myFavoriteNumber = 7;
改为任意类型 ( : any ) 后
let myFavoriteNumber: any = "seven";myFavoriteNumber = 7; // OK
任意类型 (
**: any**) 上访问任何属性都是允许的,可以认为一个变量被声明为任意类型后,对它的任何操作,返回的内容也都是任意类型。如let anyThing: any = "anything";anyThing.type = "any";anyThing.getType = () => {return "any";}anyThing.setName('Jerry');
❗注:当然这只是值编译时不会抛出异常,实际运行时是否报错取决于有无该属性。
一个变量在被声明时未指定其类型(及初始值),那么它会被识别为任意类型 (
**: any**) 。如let myVariable;myVariable = "any"; // OKmyVariable = 7; // OK
2 类型推论
如果一个变量在声明时未指定其类型,但赋予了初始值,那么它的类型会被自动推测为初始值的类型,这个过程叫类型推论。如
let myVariable = "seven"; // 有初始值,被推论为 :string 类型// ERROR: 不能将类型“number”分配给类型“string”。myVariable = 7;
3 联合类型
联合类型 (Union Types) 表示变量的取值类型为多种给定类型中的一种。格式:
t1 | t2let myVariable: string | number;myVariable = "seven"; // OKmyVariable = 7; // OK// ERROR: 不能将类型“boolean”分配给类型“string | number”。myVariable = true;
在联合类型的变量还未被确定为一准确类型变量时,只能访问其类型的共有属性和方法。
myVariable.toString(); // OK// ERROR: 类型“string | number”上不存在属性“length”。类型“number”上不存在属性“length”。myVariable.length;
联合类型的变量被赋值成功后,会被类型推论为一个准确的类型,之后只能访问它含有的方法。
myVariable = "string"; // 重新赋值,改变类型 :stringmyVariable.length; // OK
