接口的合并

接口和类型别名都能直接使用交叉类型,但除此以外,接口还能够使用继承,在继承时接口的同名接口无法进行覆盖或者交叉类型合并,而是像继承一个类那样,只能声明新的属性。

如果你直接声明多个同名接口,虽然接口会进行合并,但这些同名属性仍然需要属于同一类型。

interface Struct1 {
  primitiveProp: string;
}

// 接口 Struct2 错误扩展接口 Struct1。属性 primitiveProp 的类型不兼容。不能将类型 number 分配给类型 string
interface Struct2 extends Struct1 {
  primitiveProp: number;
}

这也是接口和类型别名的重要差异之一。那么接口和类型别名之间的合并呢?其实规则一致,如接口继承类型别名和类型别名使用交叉类型合并接口。

type Base = {
  name: string;
};

interface IDerived extends Base {
  // 报错,就像继承接口一样需要类型兼容
  name: number;
  age: number;
}
interface IBase {
  name: string;
}

// 合并后的 name 同样是 never 类型
type Derived = IBase & {
  name: number;
};