关于Typescript中的并集类型和交集类型

并集和交集

并集和交集是什么,简单来说:有两个事物A和B,并集是二者内容之和,交集是二者共同拥有的内容,如图:

Typescript中的并集和交集

为了处理类型的并集和交集,Typescript为我们提供了特殊的类型运算符:并集使用|,交集使用&,类型和集合之间几乎可以画上等号:

ts 复制代码
// 并集 --> 符号: |
// 交集 --> 符号: &
type Cat = { name: string, purrs: boolean }
type Dog = { name: string, barks: boolean, wags: boolean }
type CatOrDogOrBoth = Cat | Dog
type CatAndDog = Cat & Dog

如果某个值是CatOrDogOrBoth类型,那么我们将得到什么信息呢?哪些值可以赋值给CatOrDogOrBoth类型的变量呢?可以是Cat类型的,也可以是Dog类型的,还可以二者兼具:

ts 复制代码
// Cat
let a: CatOrDogOrBoth = {
    name: "Bonkers",
    purrs: true
}

// Dog
a = {
    name: "Domino",
    barks: true,
    wags: true
}

// 二者兼具
a = {
    name: "Donkers",
    barks: true,
    purrs: true,
    wags: true
}

注意: 一个并集类型的值不一定属于并集中某一个成员,还可以同时属于每个成员,但是如果并集不相交,那么值只能属于并集类型中的某个成员

另外,还有一个类型CatAndDog,从这个类型中又能获取到什么信息呢?也就是说你有一个犬猫混种超级宠物,它不仅有名字(name),还能喵喵叫(puur),还可以汪汪叫(bark),还可以摇尾巴(wag):

ts 复制代码
let b: CatAndDog = {
    name: "Domino",
    barks: true,
    purrs: true,
    wags: true
}

在大多数情况下,并集通常比交集更符合常理:

ts 复制代码
function abTest(a: string, b: number) {
    return a || b
}

该函数:如果a是真值,返回类型为string,否则为number,也就是string | number。

相关推荐
我是若尘9 分钟前
用 Git Worktree 同时开多个需求,不用来回 stash
前端
IT_陈寒27 分钟前
Vue的v-for为什么不加key也能工作?我差点翻车
前端·人工智能·后端
小碗羊肉30 分钟前
【JavaWeb | 第十二篇】项目实战——登录功能
java·前端·数据库
一个处女座的程序猿O(∩_∩)O30 分钟前
如何保持nginx配置与前端打包dist的路径保持一致、解决页面刷新白屏以及页面跳转问题
运维·前端·nginx
十有八七1 小时前
AI 开发,本质是一场文档的生命周期管理
前端·人工智能
Hyyy2 小时前
普通前端自救记录——第0周
前端
前端若水2 小时前
在 Vue 2 与 Vue 3 中使用 markdown-it-vue 渲染 Markdown 和数学公式
前端·javascript·vue.js
之歆2 小时前
DAY_10 JavaScript 深度解析:原型链 · 引用类型 · 内置对象 · 数组方法全攻略(下)
开发语言·前端·javascript·ecmascript
行星飞行3 小时前
从 cursor 、 Claude code 迁移到 codex,30 分钟快速上手 codex 常用技巧
前端
Pu_Nine_93 小时前
前端埋点从入门到企业实践:手写一个Demo + 主流方案对比
前端·埋点