ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

The Concise TypeScript Book 精讲:Intersection Types(交叉类型)——用 `` 将多个类型组合为一个类型

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),仅供参考
返回列表