接口的合并
接口和类型别名都能直接使用交叉类型,但除此以外,接口还能够使用继承,在继承时接口的同名接口无法进行覆盖或者交叉类型合并,而是像继承一个类那样,只能声明新的属性。
如果你直接声明多个同名接口,虽然接口会进行合并,但这些同名属性仍然需要属于同一类型。
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;
};