类型推论
如果没有明确的指定类型,那么Typescript会依照类型推论的规则推断出一个类型
什么是类型推论
以下代码虽然没有指定类型,但是会在编译的时候报错
let infer = 'seven';
infer = 7;
// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.
事实上。它等价于:
let infer: string = 'seven';
infer = 7
// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.
TypeScript会在没有明确的指定类型的时候推测出一个类型,这就是类型推论。
如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成any类型而不被完全类型检查
let infer;
infer = 'six';
infer = 6;
联合类型
联合类型表示取值可以为多种类型中的一种
let strnum: string | number;
strnum = 'seven';
strnum = 7;
let strnum: string | number;
strnum = true;
// index.ts(2,1): error TS2322: Type 'boolean' is not assignable to type 'string | number'.
// Type 'boolean' is not assignable to type 'number'.
联合类型使用 | 分隔每一个类型。
访问联合类型的属性和方法
当TypeScript不确定一个联合类型的变量到底是哪一个类型的时候,我们只能访问此联合类型的共有的所有属性或者方法
function getLength(something: string | number): number {
return something.length;
}
// index.ts(2,22): error TS2339: Property 'length' does not exist on type 'string | number'.
// Property 'length' does not exist on type 'number'.
上例中,length不是string和number的公有属性,所以会报错
访问string和number的共同属性是没问题的
function getString(something: string | number): string {
return something.toString();
}
联合类型的变量在赋值的时候,会根据类型推论的规则推断出一个类型
function strnum: string | number;
strnum = 'seven';
console.log(strnum.length); //5
strnum = 5;
console.log(strnum.length); //编译时候报错
// index.ts(5,30): error TS2339: Property 'length' does not exist on type 'number'.
上例中,第三行的strnum被推断成了string,访问它的length属性不会报错。而在第四行的strnum被推断成了number,访问它的length属性时就会报错了。