ts 类型别名type和接口interface的区别


// 首先说下可以用接口重写类型别名
type People = { name: string age: number } // 可以重写为下面这个接口 interface People { name: string age: number } // 现在二者完全一样,任何使用类型别名 People 的地方都可以使用接口 People
// 第一个区别
// 类型别名右边可以是多种类型,包括类型、|、&等
type A = number;
type B = A | string

// 接口只能为类型
interface A {
  name: string
}
// 第二个区别
// 扩展接口时会检查是否可被赋值
interface A {
  func(x: number): number  
}
interface B extends A{
  func(x: string): string  
}

// 如果 B 继承 A 会报错
// 而如果把接口写成类型别名,extends 换成 & 则不会报错,别名会重载这个 func
// 第三个区别
// 同一作用域下的多个同名接口会自动合并,而类型别名则会报错,这个就是声明合并

interface People{
  name: string  
}

interface People{
  age: number  
}

// People在同一作用下会合并如下
interface People{
  name: string
   age: number
}
// 如果将 interface 换成 type 则会报错
ts