The Concise TypeScript Book 精讲:Intersection Types(交叉类型)——用 `` 将多个类型组合为一个类型
The Concise TypeScript Book 精讲Intersection Types交叉类型——用将多个类型组合为一个类型【免费下载链接】typescript-bookThe Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.项目地址: https://gitcode.com/gh_mirrors/typ/typescript-book交叉类型Intersection Type是 TypeScript 类型系统中用于组合的核心工具它代表一个同时拥有两个或更多类型全部属性的值语法上使用符号连接各类型。本指南以开源项目 The Concise TypeScript Book 中 intersection-types.md阿拉伯语版及 英文原版 为主体结合仓库内 union-type.md、extending-types.md、differences-between-type-and-interface.md 等关联章节从基础语法到实战组合技巧、再到与联合类型和接口继承的取舍帮你一次吃透交叉类型。什么是交叉类型交叉类型描述的是同时满足多个类型约束的值。原文档给出的定义是交叉类型是一个代表拥有两个或更多类型所有属性的值的类型各类型之间用符号连接。原文档的完整示例type X { a: string; }; type Y { b: string; }; type J X Y; // Intersection const j: J { a: a, b: b, };可以看到J X Y之后j必须同时提供a和b两个属性缺一不可。这正是交叉类型的语义它做的是属性集合的并集——类型X Y的成员必须满足X的全部约束也满足Y的全部约束。在本书的目录结构中交叉类型位于 table-of-contents.md 第 33 节紧跟在 Union Type联合类型第 32 节之后、Type Indexing类型索引第 34 节之前是类型操作Type Manipulation主题下的基础构成之一。交叉类型与联合类型与|的本质区别要理解交叉类型最好的对照物就是它的姊妹——联合类型。本书 union-type.md 对联合类型的定义是联合类型代表一个值可以是若干类型中的某一种用|符号连接let x: string | number; x hello; // Valid x 123; // Valid两者的语义恰好相反运算符语义值必须满足的条件A \| B联合值要么是 A要么是 B满足其中任意一个即可A B交叉值同时是 A 和 B满足全部类型的约束对于对象类型联合类型取属性的交集能安全访问的只有两边共有的属性而交叉类型取属性的并集拥有两边所有属性。这一点在 differences-between-type-and-interface.md 中被明确点出类型别名在定义联合与交叉类型时比接口更灵活——用type关键字可以轻松通过|创建联合类型、通过创建交叉类型而接口没有内置的交叉类型支持只能间接表达联合类型。用交叉类型组合对象类型交叉类型最常见的实战场景是把多个对象类型拼接成一个完整类型例如本书 differences-between-type-and-interface.md 中的人员信息示例type Department dep-x | dep-y; // Union type Person { name: string; age: number; }; type Employee { id: number; department: Department; }; type EmployeeInfo Person Employee; // Intersection这里EmployeeInfo同时具备Person的name、age与Employee的id、department非常适合描述继承关系或角色叠加的数据结构例如员工同时是人、管理员同时是用户等模型。交叉类型同样可以与接口配合使用。由于接口本身也是类型它们可以直接参与交叉interface A { x: string; y: number; } type B A { j: string; }; const c: B { x: x, y: 123, j: j, };这也是本书 differences-between-type-and-interface.md 给出的示例——type关键字可以用把接口A与匿名对象类型组合成新类型B实现在已有接口基础上追加属性的效果。交叉类型与接口继承extends的取舍提到组合类型很多人会想到接口的extends继承。本书 extending-types.md 专门厘清了两者的边界接口可以通过extends复制其他类型的成员interface X { a: string; } interface Y extends X { b: string; }接口还可以同时继承多个类型interface A { a: string; } interface B { b: string; } interface Y extends A, B { y: string; }但关键在于extends关键字只作用于接口和类对于type类型别名组合方式就是交叉类型type A { a: number; }; type B { b: number; }; type C A B;同时继承方向是单向的可以用接口继承extends一个type声明的对象类型但不能反过来用类型别名extends接口类型别名没有extends关键字type A { a: string; }; interface B extends A { b: string; }由此可以总结出两条实用准则需要声明合并declaration merging或面向对象风格时优先用接口的extends详见 differences-between-type-and-interface.md 对声明合并的讲解需要把联合类型、交叉类型、泛型等复杂结构组合起来时用type因为接口无法extends一个像联合类型这样的复杂类型。交叉类型在类型操作体系中的位置本书 type-manipulation.md 指出可以通过组合、操作或转换已有类型来创建新类型而交叉类型正是组合这一路线的核心操作符type A { foo: number }; type B { bar: string }; type C A B; // Intersection of A and B const obj: C { foo: 42, bar: hello };它与其他类型操作手段如基于keyof的 Mapped Types映射类型、索引签名等并不冲突而是互补交叉负责横向合并多个来源映射负责按规则批量改写属性。此外交叉类型与 Object Types对象类型 章节强调的对象类型描述对象形状的能力一脉相承——交叉后的结果仍然是一个符合形状约束的对象类型可以继续被索引、被映射、被泛型约束使用。使用交叉类型时的注意事项在享受的组合便利时有几个边界情况需要心中有数同名属性的冲突当两个被交叉的类型包含同名但类型不兼容的属性时TypeScript 会试图将两者合并结果往往收敛为never不可能的类型。例如{ a: string } { a: number }的a属性类型会变成string number也就是never——没有任何值能同时是string又是number。因此在实际建模时应避免交叉出相互矛盾的同名属性。交叉不等于运行时合并交叉类型只在类型层面生效它不会在运行时深拷贝或合并两个对象。赋值时仍需自己构造出同时满足全部约束的对象字面量。优先用接口表达继承语义如果只是简单的单层继承interface Y extends X在可读性和可扩展性支持声明合并上通常优于type Y X {}交叉类型的优势在于处理多源组合、复杂类型与泛型场景。小结交叉类型A B是 TypeScript 类型组合的基础设施它表示同时拥有 A 与 B 全部属性的值与表示要么 A 要么 B的联合类型A | B形成互补它与接口的extends各有适用边界——接口继承面向类和声明合并交叉类型则能自由组合包括对象类型、接口乃至复杂泛型在内的任意类型。掌握就等于掌握了在类型层面拼装领域模型的核心能力。想继续深入可在仓库中对照阅读 intersection-types.md 英文版、union-type.md、extending-types.md 与 differences-between-type-and-interface.md这些章节共同构成了本书类型系统部分的完整脉络。【免费下载链接】typescript-bookThe Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.项目地址: https://gitcode.com/gh_mirrors/typ/typescript-book创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Kornia 颜色空间转换指南:YCbCr 与 RGB 互转(rgb_to_ycbcr / ycbcr_to_rgb 函数与模块详解)

Kornia 颜色空间转换指南:YCbCr 与 RGB 互转(rgb_to_ycbcr / ycbcr_to_rgb 函数与模块详解)

计算机视觉人工智能深度学习图像处理 【免费下载链接】kornia 🐍 Geometric Computer Vision Library for Spatial AI 项目地址: https://gitcode.com/gh_mirrors/ko/kornia 点击查看 免费下载 导读 YCbCr 是数字视频与图像压缩(如 JPEG、H…

2026/9/24 17:21:26 阅读更多 →
如何在内网环境用Argos Translate搭建离线英中翻译流水线(完整流程)

如何在内网环境用Argos Translate搭建离线英中翻译流水线(完整流程)

如何在内网环境用Argos Translate搭建离线英中翻译流水线(完整流程) 【免费下载链接】argos-translate Open-source offline translation library written in Python 项目地址: https://gitcode.com/GitHub_Trending/ar/argos-translate 场景先说…

2026/9/24 17:21:26 阅读更多 →
shadcn-vue 的 Input Group 组件完全指南:从基础用法到源码级实现解析

shadcn-vue 的 Input Group 组件完全指南:从基础用法到源码级实现解析

UI组件前端 【免费下载链接】shadcn-vue Vue port of shadcn-ui 项目地址: https://gitcode.com/gh_mirrors/sh/shadcn-vue 点击查看 免费下载 导读 Input Group(输入组)是 shadcn-vue 中用于在输入框(Input)或文本域…

2026/9/24 17:21:26 阅读更多 →

最新新闻

C# WinForms+OpenCvSharp实现实时图像与TCP检测结果同窗显示

C# WinForms+OpenCvSharp实现实时图像与TCP检测结果同窗显示

简介:针对相机无法通过SDK直接取图、只能从本地文件读取场景,这份C#工程源码提供了一套图像与通信联动的检测可视化方案。程序基于System.Drawing与System.Net.Sockets实现两路并行:定时扫描本地文件夹并实时绘制最新图像,同时监听…

2026/9/24 18:10:58 阅读更多 →
JavaWeb电子相册毕设项目:JSP+Servlet+JDBC+MySQL实战全解析

JavaWeb电子相册毕设项目:JSP+Servlet+JDBC+MySQL实战全解析

简介:这份基于JavaWeb的电子相册毕设项目,是一套完整的网络相册管理系统源码包,面向计算机相关专业准备毕业设计的学生及需要项目实战的Java初学者,可直接作为毕设使用。系统采用B/S结构,前台支持用户注册登录、网站介…

2026/9/24 18:10:58 阅读更多 →
基于Python和CNN的人脸表情识别课程设计全流程解析

基于Python和CNN的人脸表情识别课程设计全流程解析

简介:这是一份基于深度学习的人脸表情识别系统完整实现,面向高校课程设计、毕业设计及计算机视觉初学者,解决从数据集处理、模型训练到实时表情识别落地的全流程问题。压缩包共19个文件、约10.81MB,其中10个Python脚本为核心源码&…

2026/9/24 18:10:58 阅读更多 →
Python+Django实战:高校学生违纪管理系统开发与数据建模

Python+Django实战:高校学生违纪管理系统开发与数据建模

简介:这套基于Python的高校学生违纪信息管理系统,面向教育信息化开发者、高校管理人员及需要搭建同类Web管理系统的技术人群,系统围绕学生违纪数据的录入、分类统计、处罚记录、报表导出、权限管理和预警通知等核心功能展开,能够显…

2026/9/24 18:10:58 阅读更多 →
JavaEE二手图书交易平台源码实战:分层架构与部署避坑指南

JavaEE二手图书交易平台源码实战:分层架构与部署避坑指南

简介:这是一套面向高校计算机相关专业学生的JavaEE课程设计完整资源,以二手图书交易平台为选题,适合作为期末大作业、课程设计或毕业设计参考,新手也能快速上手。资源包共173个文件,约25.68MB,涵盖21个Java…

2026/9/24 18:10:58 阅读更多 →
JavaEE二手图书交易平台实战:Spring+MyBatis从零搭建与避坑指南

JavaEE二手图书交易平台实战:Spring+MyBatis从零搭建与避坑指南

简介:这是一套面向高校计算机相关专业学生的JavaEE课程设计完整项目,以二手图书交易平台为主题,适合作为期末大作业、课程设计或毕业设计参考。项目采用Java语言开发,功能覆盖用户注册登录、图书发布、分类浏览、订单管理等核心业…

2026/9/24 18:09:58 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →