TypeScript 交叉类型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 章节为骨架结合仓库内 exploring-the-type-system.md、extending-types.md、differences-between-type-and-interface.md 等章节的源码级佐证带你彻底掌握交叉类型的定义、与联合类型的本质区别、与extends的关系以及在实际项目中的典型应用与注意事项。一、什么是交叉类型核心定义与基础语法根据仓库文档 intersection-types.md 的定义An Intersection Type is a type that represents a value that has all the properties of two or more types. Intersection Types are denoted using thesymbol between each type.交叉类型表示一个「同时拥有两个或更多类型全部属性」的值的类型使用符号连接各个参与组合的类型。这是它区别于联合类型|表示其一的最本质特征。基础示例文档给出了最经典的演示代码type X { a: string; }; type Y { b: string; }; type J X Y; // Intersection const j: J { a: a, b: b, };这里J X Y意味着任何类型为J的变量必须同时满足X的约束拥有a: string和Y的约束拥有b: string。因此j必须同时提供a和b两个属性缺一不可。与之形成鲜明对比的是 union-type.md 中的联合类型——联合类型string | number表示值可以是其中任意一种类型let x: string | number; x hello; // Valid x 123; // Valid一句话总结联合类型|是或关系交叉类型是且关系。二、集合论视角为什么交叉类型更窄仓库的 exploring-the-type-system.md 用集合论的视角精确刻画了交叉类型的语义。文档中的类型系统映射表明确写道TypeScript集合论术语示例T1 \| T2T1 ∪ T2并集 / uniontype XY X \| YT1 T2T1 ∩ T2交集 / intersectiontype XY X Y也就是说联合类型T1 | T2创建的是一个更宽的集合包含两边所有可能值type X { a: string }; type Y { b: string }; type XY X | Y; const r: XY { a: a, b: x }; // Valid只要满足其中任意一个形状即可交叉类型T1 T2创建的是一个更窄的集合只保留同时满足两边的值type X { a: string; }; type Y { a: string; b: string; }; type XY X Y; const r: XY { a: a }; // Invalid缺少 Y 要求的 b const j: XY { a: a, b: b }; // Valid同时满足 X 与 Y这也是为什么文档中特别强调交叉类型把可赋值值的范围收窄了要求值必须拥有所有参与类型声明的每一个属性。三、交叉类型与 extends两种扩展类型的方式在 TypeScript 中扩展一个既有类型有两种途径extends关键字和运算符。仓库的 extending-types.md 明确指出它们的分工Theextendskeyword works only on interfaces and classes, for types use an intersection.extends只能用于interface和class对type别名进行扩展时必须使用交叉类型type A { a: number; }; type B { b: number; }; type C A B; // 等价于type C 扩展自 A 和 B三种扩展方式的对比扩展方式适用对象示例interface Y extends X接口/类可多继承interface Y extends A, B { y: string }type C A B类型别名typetype C A Binterface B extends A接口扩展类型别名interface B extends A { b: string }值得注意的是文档还补充了一条不对称规则见 extending-types.md可以用interface去扩展一个type但不能反过来用type的语法去extends一个接口type A { a: string; }; interface B extends A { b: string; }而如果想把接口组合进类型别名依然要回到交叉运算type B A SomeInterface。交叉类型因此成为打通interface与type世界的关键桥梁。四、type 与 interface 的差异交叉类型为何属于 type为什么交叉类型通常由type关键字来声明仓库的 differences-between-type-and-interface.md 给出了答案Types are more flexible when it comes to defining Union and Intersection Types. With thetypekeyword, you can easily create union types using the|operator and intersection types using theoperator. While interfaces can also represent union types indirectly, they dont have built-in support for intersection types.翻译过来即type在定义联合类型与交叉类型时更加灵活interface没有内建的交叉类型intersection支持。具体表现如下type Department dep-x | dep-y; // Union type Person { name: string; age: number; }; type Employee { id: number; department: Department; }; type EmployeeInfo Person Employee; // Intersection员工信息 人 雇员属性接口可以通过type C A | B间接参与联合类型但要做交叉几乎总是使用type别名配合。此外interface虽然支持同名声明合并declaration merging但type不支持——这两点共同决定了当你的核心诉求是把多个形状组合成一个新形状时type是最直接的工具。组合 interface 的交叉写法如果你手头已有两个interface想得到它们的交叉也只需通过type完成interface A { x: string; y: number; } type B A { j: string; }; const c: B { x: x, y: 123, j: j, };五、交叉类型的典型实战场景交叉类型在真实项目中最常见的应用场景包括以下几种。1. 领域模型的组合Mixin / 特征合并把相互独立的领域形状拼装成完整实体是最直观的用法type Address { street: string; city: string; }; type Contact { email: string; phone: string; }; type Customer Address Contact; const customer: Customer { street: Main St, city: Beijing, email: aexample.com, phone: 13800000000, };这样Customer就同时拥有了地址与联系方式的所有字段无需重复声明。2. 叠加横切属性在基础对象上叠加通用属性如审计字段、ID、时间戳type Entity { id: string; createdAt: Date; }; type Product { name: string; price: number; }; type StoredProduct Entity Product;3. 函数参数与返回值的精确描述交叉类型也常用于描述必须是 A 同时是 B的参数或返回值配合Partial、Pick等工具类型见 type-manipulation.md 中type C A B的组合范式可以构造出非常精细的类型约束。六、注意事项与常见陷阱1. 同名属性的类型冲突当参与交叉的两个类型拥有同名但类型不同的属性时交叉结果的属性类型会变成两者的叠加对基本类型而言往往退化为never或产生类型错误。因此在组合第三方类型时需要先确认属性名是否冲突。2. 交叉并不等于继承的替代品虽然能实现类似extends的组合效果但两者的语义不同interface extends是面向对象式的继承子接口是父接口的子类型而交叉是纯结构层面的集合运算。对于需要声明合并、需要被class实现或依赖继承关系的场景应优先使用interface extends对于纯数据形状的组合type更简洁灵活。3. 与可选属性、索引签名配合时的可读性当参与交叉的类型较多时建议为每个参与方单独命名如type A、type B再组合出type C A B而不是写一长串匿名对象字面量的交叉这样既利于类型提示也便于阅读与维护。七、小结本文围绕仓库 intersection-types.md 的核心定义展开交叉类型用表示同时拥有所有属性的组合类型从集合论看它是类型的交集产生比任何参与方都更窄的集合佐证见 exploring-the-type-system.md扩展type别名必须使用交叉extends仅适用于interface/class佐证见 extending-types.mdinterface没有内建的交叉能力组合接口也需借道type佐证见 differences-between-type-and-interface.md。在实际开发中将交叉类型用于领域模型组合、横切属性叠加并与interface的extends配合使用可以写出类型安全、结构清晰、可维护性强的 TypeScript 代码。【免费下载链接】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),仅供参考
企业数字化 ERP 产品动态
相关推荐
2026年实测这3个高性价比降AI率软件,毕业论文AI率检测一次过不返工! 最近辅导学弟学妹写论文,发现一个新情况:大家现在不只是担心查重率高,更怕的是AIGC检测不过关。导师一句“AI痕迹太重”,可能直接让你全文推翻重写。知网、维普的AI检测红线就卡在10%,一旦超标,论文就可能被… · 2026/9/24 16:25:12
项目日报:2026-09-23 一、UI 像素化改造
1. 装备槽改造
装备槽从图标改为文字标签(武器/护甲/头盔/靴子/戒指/项链)移除头盔槽,6 格减为 5 格所有格子圆角统一为 10px
2. 侧边栏导航
侧边栏背景改为透明(去掉方框包裹)导航图标更换为 UI 资… · 2026/9/24 16:25:06
MOO 编程语言 ANTLR4 语法解析:grammars-v4 中的 moo 语法工程实战指南 编程语言编译器开发工具 【免费下载链接】grammars-v4 Grammars written for ANTLR v4; expectation that the grammars are free of actions. 项目地址: https://gitcode.com/gh_mirrors/gr/grammars-v4 点击查看 免费下载 本指南围绕 grammars-v4 仓库中的 moo 语… · 2026/9/24 16:24:57
【Coze】【视频】三分钟读一本书 今天给大家演示一个 《三分钟读一本书》Coze 工作流。该工作流通过大模型驱动的分镜文案生成、图像合成、语音合成以及视频草稿自动创建等一整套流程,将一本书的内容浓缩为一个三分钟的视频,实现从文本到成片的全自动化制作。用户只需输入书名、作者和个人账号信息,即可得到… · 2026/9/24 17:02:12
第24篇-MCP-Client架构-Host应用如何管理多个Server连接 【MCP 全栈教程】第 24 篇:MCP Client 架构——Host 应用如何管理多个 Server 连接 本系列定位:从协议原理到 Server 开发、Client 开发、再到各大平台实战集成,系统化掌握 MCP(Model Context Protocol)全栈技术体系。… · 2026/9/24 17:01:59
第21篇-MCP-Server测试-MCP-Inspector与自动化测试 【MCP 全栈教程】第 21 篇:MCP Server 测试——MCP Inspector 与自动化测试 本系列定位:从协议原理到 Server 开发、Client 开发、再到各大平台实战集成,系统化掌握 MCP(Model Context Protocol)全栈技术体系。 本篇你… · 2026/9/24 17:01:59
OneNote 笔记如何备份才不丢数据:3 种方案完整保姆级攻略 OneNote 笔记如何备份才不丢数据:3 种方案完整保姆级攻略 【免费下载链接】cs-408 计算机考研专业课程408相关的复习经验,资源和OneNote笔记 项目地址: https://gitcode.com/GitHub_Trending/cs/cs-408
用 OneNote 攒了几个月笔记,某次… · 2026/9/24 17:01:59
使用 AWS SDK for C++ 编写 Hello SNS:通过 ListTopics 入门 Amazon SNS 示例工程教程后端 【免费下载链接】aws-doc-sdk-examples Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below. 项目地… · 2026/9/24 17:01:53
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44