类型推论
如果没有明确的指定类型,那么 TypeScript
会依照类型推论(Type Inference
)的规则推断出一个类型。
什么是类型推论
以下代码虽然没有指定类型,但是会在编译的时候报错:
let myName = 'seven';
myName = 7;
// Type 'number' is not assignable to type 'string'.
事实上,它等价于:
let myName: string = 'seven';
myName = 7;
TypeScript
会在没有明确的指定类型的时候推测出一个类型,这就是类型推论。
如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成
any
类型而完全不被类型检查:
let myName;
myName = 'seven';
myName = 7;
联合类型
联合类型(Union Types
)表示取值可以为多种类型中的一种。联合类型用 |
分割每个类型。
联合类型的例子
let myName: string | number;
myName = 'Tom'; // ok
myName = 18; // ok
myName = true; // Type 'boolean' is not assignable to type 'string | number'. Type 'boolean' is not assignable to type 'number'.
这里的 let myName: string | number
的含义是允许 myName
的类型是 string
或者 number
, 但是不能是其他的类型。
访问联合类型的属性或方法
当 TypeScript
不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法:
function getLength(something: string | number): number {
return something.length;
}
// Property 'length' does not exist on type 'string | number'.
// Property 'length' does not exist on type 'number'.
上例中,length
不是 string
和 number
的共有属性,所以会报错。
访问共有length
属性的类型就不会报错:
function getLength(something: string | number[]): number {
return something.length;
}
联合类型的变量在被赋值的时候,会根据类型推论的规则推断出一个类型:
let myName: string | number;
myFavoriteNumber = 'Tom';
console.log(myName.length); // 5
myName = 17;
console.log(myFavoriteNumber.length); // 编译时报错
// Property 'length' does not exist on type 'number'
上例中,第二行的 myName
被推断成了 string
,访问它的 length
属性不会报错。而第四行的 myName
被推断成了 number
,访问它的 length
属性时就报错了.