类型推论

变量申明如果没有明确的指定类型,那么 TypeScript 会依照类型推论的规则推断出一个类型

  1. let myNumber = 'seven';
  2. myNumber = 7; // Error
  3. // 等价于
  4. let myNumber: string = 'seven';
  5. myNumber = 7;
  6. // myNumer设置为string类型所以不能修改为数字类型

变量声明但是未赋值,会推论为 any

  1. let x;
  2. x = 1;
  3. x = 'aaa'

联合类型

联合类型表示取值可以为多种类型中的一种,使用|分隔每个类型

  1. let numberOrString: number | string;
  2. numberOrString = 10;
  3. numberOrString = "string";

访问联合类型的属性或方法

TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法
错误示范: length不是string和number的共有属性

  1. function getLength(value: string | number): number {
  2. return value.length;
  3. } // Error

正确示范

  1. function getLength(value: string | number): string {
  2. return value.toString();
  3. }

联合类型的变量在被赋值的时候,会根据类型推论的规则推断出一个类型

  1. let numberOrString: number | string;
  2. numberOrString = "string";
  3. console.log(numberOrString.length); // 6
  4. numberOrString = 10;
  5. console.log(numberOrString.length); // 报错

类型断言

  1. 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法
  2. 类型断言不是类型转换,断言成一个联合类型中不存在的类型是不允许的

类型断言有两种形式,第一种是“尖括号”<>语法,另一个为as语法

  1. let str: any = "this is a string";
  2. let strLen: number = (<string>str).length;
  1. function getLength(value: string | number): number {
  2. const str = value as string;
  3. if (str.length) {
  4. return str.length;
  5. } else {
  6. const number = value as number;
  7. return number.toString().length;
  8. }
  9. }

两种形式是等价的