TS的联合类型和交叉类型 你真的懂吗?

109 阅读2分钟

TS的联合类型和交叉类型你真的懂吗?

前言

有很多人会把TS的联合类型交叉类型与数学中的交集并集拿出来相提并论,其实两者有着很大的区别,

联合类型 《 | 》

当声明的类型为字符串string | 数字number |布尔boolean 这些基本类型的时候:

type D = string;
type E = number;
type G = boolean;

type F = D | E | G;

const fuh: F = '12';
const fui: F = 12;
const fuj: F = false;

//不会报错
console.log(fuh, fui, fuj);

当声明的类型为复杂类型 如对象的时候:

type A = {
  name: string;
  id: number;
}
type B = {
  name: number;
  age: number;
}

注:此时A,B的类型中的name属性的类型是不相同的,前者是string,后者是number

声明一个联合类型C,并定义一个对象count,类型为C;

在使用 联合类型 的时候并且是 赋值 的时候,count必须要有全部的是属性 也是就A,B的全部属性:如下图,缺一不可

type C = A | B ;
const count: C = {
  id: 12,
  age: 12,
  //name的类型可以为A,B任意一个的类型《string | number》
  name: 12
}

console.log(count);

否则就像现在一样: image.png 但是在使用 联合类型 的时候并且是读取属性的时候,只能读到他们共有的部分 《name》

image.png

交叉类型 《 & 》

当声明的类型为字符串string | 数字number |布尔boolean 这些基本类型的时候:

type D = string;
type E = number;
type G = boolean;

type F = D & E & G;

const fuh: F = '12';
const fui: F = 12;
const fuj: F = false;
//会报错,错误如下:
console.log(fuh, fui, fuj);

注:如果两个类型不相同的话,TS会默认把它解析成never类型

image.png 注意一般基本数据很少使用联合类型

当声明的类型为复杂类型 如对象的时候在 《交叉类型》 的情况下并且 赋值 的时候,应该要包含A中的所有类型,或者包含B中所有的类型,或者AB所有类型,如下图所示:

type C = A & B ;

const count: C = {
  name: 12,
  age: 12,
  id:12
}
//或者
const count: C = {
  name: 12,
  id: 12,
}
//或者
const count: C = {
  name: 12,
  age: 12,
}
console.log(count);

否则就像现在一样:

image.png

注:如果两个类型共用的属性类型 不相同的话,TS会默认把它解析成never类型

image.png 但是在使用 交叉类型 的时候并且是读取属性的时候,可以读到他们所有的属性 image.png

希望各位都能看懂... ...

入职快一个月写