// 首先说下可以用接口重写类型别名
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 则会报错