类型推论和联合类型
类型推论
如果没有明确的指定类型,那么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所以联合类型的赋值,在允许的类型中会切换变量的类型,并在每个状态下可以单独该类型的独有的方法。
