首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第 1 章 准备知识
1.1 前端技术简介
1.2 HTML入门
1.2.1 准备开发工具
1.2.2 HTML中的基础标签
1.3 CSS入门
1.3.1 CSS选择器入门
1.3.2 CSS样式入门
1.4 JavaScript入门
1.4.1 我们为什么需要JavaScript
1.4.2 JavaScript语法简介
1.4.3 从JavaScript到TypeScript
1.5 渐进式开发框架Vue
1.5.1 第一个Vue应用
1.5.2 范例:一个简单的用户登录页面
1.5.3 Vue 3的新特性
1.5.4 我们为什么要使用Vue框架
第 2 章 TypeScript基础
2.1 重新认识TypeScript
2.1.1 安装TypeScript
2.1.2 TypeScript语言版本的HelloWorld程序
2.1.3 使用高级IDE工具
2.2 TypeScript中的基本类型
2.2.1 布尔、数值与字符串
2.2.2 特殊的空值类型
2.2.3 数组与元组
2.3 TypeScript中有关类型的高级内容
2.3.1 枚举类型
2.3.2 枚举的编译原理
2.3.3 any、never与object类型
2.3.4 关于类型断言
2.4 函数的声明和定义
2.4.1 函数的类型
2.4.2 可选参数、默认参数和不定个数参数
2.4.3 函数的重载
第 3 章 TypeScript中的面向对象编程
3.1 理解与应用“类”
3.1.1 类的定义与继承
3.1.2 类的访问权限控制
3.1.3 只读属性与存取器
3.1.4 关于静态属性与抽象类
3.1.5 类的实现原理
3.2 接口的应用
3.2.1 接口的定义
3.2.2 使用接口约定函数和可索引类型
3.2.3 使用接口来约束类
3.2.4 接口的继承
3.3 TypeScript中的类型推断与高级类型
3.3.1 关于类型推断
3.3.2 联合类型与交叉类型
3.3.3 TypeScript的类型区分能力
3.3.4 字面量类型与类型别名
当前位置:
首页>>
技术小册>>
TypeScript和Vue从入门到精通(一)
小册名称:TypeScript和Vue从入门到精通(一)
### 3.3.2 联合类型与交叉类型 在TypeScript的世界中,类型系统是其核心优势之一,它允许开发者在编译时期就捕获到许多潜在的错误,从而提高代码的质量和可维护性。联合类型(Union Types)与交叉类型(Intersection Types)是TypeScript中两种强大的类型组合机制,它们各自在解决不同类型组合问题时发挥着不可替代的作用。本章节将深入探讨这两种类型的概念、用法、以及它们在实际开发中的应用场景。 #### 3.3.2.1 联合类型(Union Types) **概念解析** 联合类型允许我们将多个类型组合成一个类型,这个类型可以是这些类型中的任何一个。使用竖线(`|`)分隔每个类型来定义联合类型。联合类型在处理不确定的变量类型时非常有用,比如一个函数可能返回多种类型的值,或者一个变量可能在不同的情况下被赋予不同的类型。 **基本用法** ```typescript let value: string | number; value = "Hello, TypeScript!"; // 正确 value = 42; // 正确 // value = true; // 错误,因为true不是string或number类型 function getLength(value: string | number): number { if (typeof value === 'string') { return value.length; } else { return value.toString().length; // 假设我们总是可以将其转换为字符串 } } ``` 在上面的例子中,`value`变量被声明为`string | number`类型,这意味着它可以被赋予一个字符串或数字类型的值。`getLength`函数接受一个`string | number`类型的参数,并返回其长度的数字表示。这里通过类型守卫(`typeof value === 'string'`)来区分处理不同的类型。 **高级应用** 联合类型不仅限于基本类型,还可以是对象、数组、甚至是其他联合类型。 ```typescript interface Square { kind: "square"; size: number; } interface Rectangle { kind: "rectangle"; width: number; height: number; } interface Circle { kind: "circle"; radius: number; } type Shape = Square | Rectangle | Circle; function getArea(shape: Shape): number { switch (shape.kind) { case "square": return shape.size * shape.size; case "rectangle": return shape.width * shape.height; case "circle": return Math.PI * shape.radius ** 2; default: throw new Error("Unsupported shape"); } } ``` 在这个例子中,我们定义了三种形状(正方形、矩形、圆形)的接口,并将它们组合成一个`Shape`联合类型。`getArea`函数根据形状的种类计算并返回面积。 #### 3.3.2.2 交叉类型(Intersection Types) **概念解析** 与联合类型相反,交叉类型将多个类型合并为一个类型,这个类型包含了所有类型的特性。使用`&`符号来定义交叉类型。交叉类型在需要对象同时满足多个类型约束时非常有用。 **基本用法** ```typescript interface Alarm { alert(): void; } interface Light { lightOn(): void; lightOff(): void; } type AlarmLight = Alarm & Light; const device: AlarmLight = { alert() { console.log('Alert!'); }, lightOn() { console.log('Light is on'); }, lightOff() { console.log('Light is off'); } }; device.alert(); device.lightOn(); ``` 在上面的例子中,`AlarmLight`是一个交叉类型,它同时拥有`Alarm`和`Light`接口的所有方法。`device`对象实现了这两个接口的所有方法,因此它符合`AlarmLight`类型。 **高级应用** 交叉类型在处理复杂对象时尤其强大,特别是当这些对象需要同时满足多个接口或类型定义时。 ```typescript interface Named { name: string; } interface Aged { age: number; } type Person = Named & Aged; const person: Person = { name: "Alice", age: 30 }; // 假设我们有一个函数,它接受一个Person类型的参数,并返回其名字和年龄 function describePerson(p: Person): string { return `${p.name} is ${p.age} years old.`; } console.log(describePerson(person)); // 输出: Alice is 30 years old. ``` 在这个例子中,`Person`类型是一个交叉类型,它结合了`Named`和`Aged`接口的特性。`describePerson`函数接受一个`Person`类型的参数,并返回一个描述性的字符串。 #### 3.3.2.3 联合类型与交叉类型的比较与选择 - **使用场景**:联合类型适用于一个变量或参数可能是多种类型之一的情况;交叉类型适用于一个对象需要同时满足多个类型定义的情况。 - **类型守卫**:在处理联合类型时,通常需要类型守卫(如`typeof`、`instanceof`、自定义类型守卫等)来区分不同的类型;而交叉类型则不需要,因为它已经明确规定了对象必须同时满足所有类型的约束。 - **类型兼容性**:联合类型与交叉类型在类型兼容性方面也有不同的表现。联合类型的一个值只能是其成员类型之一,而交叉类型的一个值必须同时满足所有成员类型的约束。 #### 结论 联合类型和交叉类型是TypeScript中处理复杂类型组合的强大工具。它们各自在解决不同类型问题时发挥着不可替代的作用。通过合理使用这两种类型,我们可以编写出更加灵活、健壮的TypeScript代码。在实际开发中,根据具体需求选择合适的类型组合方式,是提升代码质量和可维护性的关键。
上一篇:
3.3.1 关于类型推断
下一篇:
3.3.3 TypeScript的类型区分能力
该分类下的相关小册推荐:
Vue.js从入门到精通(三)
vue项目构建基础入门与实战
Vue.js从入门到精通(一)
TypeScript和Vue从入门到精通(五)
Vue面试指南
TypeScript和Vue从入门到精通(二)
TypeScript和Vue从入门到精通(三)
Vue原理与源码解析
移动端开发指南
Vue.js从入门到精通(二)
vuejs组件实例与底层原理精讲
VUE组件基础与实战