在逻辑上与联合类型互补,联合类型表示一个值的类型为多种类型之一,交叉类型则表示一个值的类型同时属于多个类型。
交叉类型字面量
由两个或多个成员类型构成,各成员类型之间使用&符号分割
与联合类型相似,如果交叉类型中存在多个相同的成员类型,那么相同的成员类型将被合并为单一成员类型
交叉类型通常与对象类型一起使用。虽然在交叉类型中也允许出现原始类型成员,但结果类型将成为never类型
交叉类型的类型成员
只要交叉类型I中任意一个成员类型包含了属性签名M,那么交叉类型I也包含属性签名M
interface A {a:boolean;}interface B {b:string;}type AB = A & B{a:boolean;b:string;}
对于交叉类型的属性签名,其类型为所有成员类型中该属性类型的交叉类型
interface A {x:{a:boolean}}interface B {x:{b:boolean}}type AB = A & B{x:{a:boolean;b:boolean}}
若交叉类型的属性签名M在所有成员类型中都是可选属性,那么该属性签名在交叉类型中也是可选属性
interface A {x:boolean;y?:string}interface B {x?:boolean;y?:string}type AB = A & B{x:boolean;y?:string}
索引签名
如果交叉类型中任何一个成员类型包含了索引签名,那么该交叉类型也拥有了索引签名
interface A {[prop:string]:string;}interface B {[prop:number]:string;}type AB = A & B{[prop:string]:string;[prop:number]:string;}
interface A {[prop:string]:{a:boolean};}interface B {[prop:string]:{b:boolean};}type AB = A & B{[prop:string]:{a:boolean} & {b:boolean};}
调用签名和构造签名
需要注意的是,当交叉类型涉及调用签名重载或构造签名重载时便失去了“加法交换律”的性质。因为交叉类型中成员类型的顺序将决定重载签名的顺序,进而将影响重载签名的解析顺序。
interface Clickable {register(x:any):void}interface Focusable {register(x:string):boolean}type ClickableAndFocusable = Clickable & Focusabletype FocusableAndFocusable = Focusable & Clickable// 这两种类型不一样
交叉类型与联合类型
优先级
当”&”和”|”符号同时使用时,&符号有更高的优先级,&相当于乘法,|相当于加法
当”&”和”|”符号与函数类型字面量使用时,”&”和”|”拥有更高的优先级
分律配性质
A & (B | C) = (A & B) | (A & C)
