【Typescript 系列】第五节:交叉类型

100 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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. 总结

类似接口继承,用于组合多个类型为一个类型 -常用于对象类型 新的类型 同事具备组合多个类型的所有属性