feng xiaohan

类型推论和类型别名

类型推论

TypeScript 会在没有明确的指定类型的时候推测出一个类型。

以下代码虽然没有指定类型,但是会在编译的时候报错:

let myFavoriteNumber = "seven";
myFavoriteNumber = 7;

// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.

事实上,它等价于:

let myFavoriteNumber: string = "seven";
myFavoriteNumber = 7;

// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.

注意:如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成 any 类型而完全不被类型检查。

let myFavoriteNumber;
myFavoriteNumber = "seven";
myFavoriteNumber = 7;

类型别名(type)

使用type给类型定义别名,定义的类型可以是联合类型,void 类型,基础类型等:

type s = string | number;
let str: s = "定义类型";

与 interface 区别

interface也可以给类型进行进行定义,但是:

  • interface可以使用extends继承别的interface,而type只能使用交叉类型将别的类型合并到一起:

    type s = number[] & B;
    interface A extends B {}
    
  • interface无法在外部表示联合类型,只能在内部的属性里表示;而type很好表示联合类型:

    type s = number[] | string;
    interface A extends B {
      name: string | number;
    }
    
  • interface遇到重名的interface会自动合并;type在同一个命名空间不接受重名;

extends

type可以使用extends做包含的意思,extends左边的值作为右边类型的子类型:

type num = 1 extends number ? 1 : 0;