持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
1. 引言
理解为类型的合并类型,交集,拥有交叉的类型的所有类型值
2. 含义
寻找集合的交集,自定义对象类型交叉为合并,单一类型组合交叉为寻找交集
3. 作用
唯一性: A & A 等价于A 交换律:A & B 等价于B & A 结合律:(A & B) & C 等价于 A & (B & C) 父类型收敛:如果B是A的父类型,则A & B 将被收敛成A类型
4. 例子
例句一:
type No = string & number // never
type N1 = any & 1 // any
type N2 = any & never // never
type N3 = any & unknown // any
type N4 = any & true // any
// any 除了并never以外,都是返回any
例句二:
type A = {kind: 'a',foo: string}
type B = {kind: 'b',foo: number}
type C = {kind: 'c',foo: number}
type D = {kind: 'a',foo: string}
type AB = A & B // never
type BC = B & C // never
type AC = A & C // never
type AD = A & D // A & D
type BD = B & D // never
例句三:
type F1 = (a: string,b: string) => void
type F2 = (a: number,b: number) => void
type Fun = F1 & F2 // F1 & F2
let fff:Fun = (a: string | number,b: string | number) => {}
fff('hello','nihao') // ok
fff(1,2) // ok
fff(2,'nihao') // error
例句四:
type A1 = 1 & number // 1
type A2 = '1' & string // '1'
type A3 = true & boolean // true
type A4 = 1 & '1' // never
例句五:
interface Point {
x: number;
y: number;
}
interface Named {
name: string;
}
type merge = Point & Named // Point & Named ===> {x: number; y: number; name: string;}
例句六:
interface X {
c: string;
d: string;
}
interface Y {
c: number;
e: string;
}
type XY = X & Y; // =====> {c: never;d: string;e: string}
type YX = Y & X; // =====> {c: never;d: string;e: string}
let p:XY = {c: 'c',d: 'd',e: 'e'} // 报错,c为never类型
let p2:YX = {c: 1,d: 'd',e: 'e'} // 报错,c为never类型
例句七
interface DD {d: boolean}
interface EE {c: string}
interface RR {r: number}
interface AA {x: DD}
interface BB {x: EE}
interface CC {x: RR}
type ABC = AA & BB & CC
let abc: ABC = {
x: {
d: true,
c: '果子',
r: 26
}
}
5. 总结
类似接口继承,用于组合多个类型为一个类型 -常用于对象类型 新的类型 同事具备组合多个类型的所有属性