1.TS的交叉类型(交集)
type A = number | string 此时A为never,因为number与string无交集
type LeftHand = {
left:string
}
type RightHand = {
right:string
}
type C = LeftHand | RightHand
type D = LeftHand & RightHand
const d : D = {
left:'有左手',
right:'有右手'
// 缺少left或right都会报错
}
注:LeftHand可以有right吗?可以有
type LeftHand = {
left:string
}
const b = {
left:'yes',
right:'yes'
}
const a:LeftHand = b // 直接赋值不会报错
const a1:LeftHand = { // 声明加赋值会报错
left:'yes',
right:'yes' // error
}
Type的交集可以用来继承
interface也能交集
交叉类型的特殊场景:
当多个类型中有相同属性时,属性之间也会进行交集运算
当交叉类型中的属性有冲突时,未报错,但是当声明赋值的时候,冲突的属性报错,类型为never
type Person = {
name:string,
id:number
}
type User = {
admin:string,
id:string
}
type p = Person & User
const p1:p = {
name:'123',
admin:'123',
id:1 // error, id为never
}
当时多个类型中的相同属性的值为指定值时
u1为never,报错
type Person = {
name:string,
id:'a'
}
type User = {
admin:string,
id:'b'
} & Person
const u1:User = { // error
}
当使用接口进行交集时产生属性冲突时会直接报错
interface Person {
name:string,
id:'a'
}
interface User extends Person { // error 属性id类型不兼容
admin:string,
id:'b'
}
两个类型中的方法的参数产生冲突时进行交集运算,会将 & 变成 |
type A = {
method: (a:number) => void
}
type B = {
method: (a:string) => void
} & A
const b:B = {
method(a) {
a // number | string
}
}
总结:交叉类型常用于有交集的类型A、B,如果A、B无交集,可能得到never,也可能只是属性为never