联合类型
多种不同的类型的组合。
{interface Bird {fly(): void;layEggs(): void;}interface Fish {swim(): void;layEggs(): void;}const getPet: () => Bird | Fish = () => {return {// ...} as Bird | Fish;};const Pet = getPet();Pet.layEggs(); // ok// 类型“Bird | Fish”上不存在属性“fly”。// 类型“Fish”上不存在属性“fly”。ts(2339)// Pet.fly();}
交叉类型
将多个类型合并成一个类型。合并后类型将拥有所有成员类型。交叉类型的真正用武之地是将多个接口类型合并成一个类型。
如果合并的多个接口类型存在同名属性会是什么效果呢?
type IntersectionTypeConfict = { id: number; name: string; }& { age: number; name: number; };const mixedConflict: IntersectionTypeConfict = {id: 1,name: 2, // ts(2322) 错误,'number' 类型不能赋给 'never' 类型age: 2};
- 如果同名类型不兼容,合并后,将会出现两个类型的交叉类型,如同名属性 name: string 和 name: number。合并后 name: string & number,即 never。
- 如果同名类型兼容,比如一个是 number,另一个是 number 的子类型、数字字面量类型,合并后 name 属性的类型就是两者中的子类型。
合并联合类型
合并联合类型为一个交叉类型,这个交叉类型需要同时满足不同的联合类型限制,也就是提取了所有联合类型的相同类型成员。这里,我们也可以将合并联合类型理解为求交集。
type UnionA = 'px' | 'em' | 'rem' | '%';type UnionB = 'vh' | 'em' | 'rem' | 'pt';type IntersectionUnion = UnionA & UnionB;const intersectionA: IntersectionUnion = 'em'; // okconst intersectionB: IntersectionUnion = 'rem'; // okconst intersectionC: IntersectionUnion = 'px'; // ts(2322)const intersectionD: IntersectionUnion = 'pt'; // ts(2322)
联合、交叉组合
联合操作符 | 的优先级低于交叉操作符 &,同样,我们可以通过使用小括弧 () 来调整操作符的优先级。
