联合类型(Union Types) 允许变量持有多种类型的值,使开发者能够存储不同类型的数据。使用符号 来表示联合类型,用以分隔变量可以持有的各种类型。
例如,假设我们有一个名为 value 的变量,它可以存储字符串或数字。在这种情况下,value 的联合类型就是 string | number。这表示 value 可以被赋值为字符串或数字。
通过使用联合类型,开发者可以创建更灵活的代码,能够处理多种数据类型。联合类型增强了类型检查,有助于在处理可能具有多种类型的变量时防止错误。
联合类型的定义
在 TypeScript 中,联合类型允许你定义一个变量或函数参数,使其可以持有多种类型的值。这提供了处理数据的灵活性,让你无需类型转换或大量条件判断即可处理不同类型的值。
定义联合类型时,使用管道符号 分隔想要包含的类型。例如,你可以声明一个类型为 number | string 的变量,这意味着它可以持有数字或字符串值。
联合类型可以组合基本类型(如 number、string、boolean 等),也可以组合更复杂的结构,如接口、数组,甚至其他联合类型。例如,你可以定义类型为 string | number[] 的变量,它可以存储字符串或数字数组。
联合类型可用于构建数组或具有不同类型属性的对象等数据结构。此外,联合类型也常用于函数参数,允许定义接受多种类型值的参数。
TypeScript 中联合类型的常见使用场景
TypeScript 中的联合类型允许变量具有多种类型,这在变量在不同时刻可能持有不同类型值的情况下非常有用。使用联合类型,开发者既能享受静态类型的好处,又能保持代码的灵活性。
一个常见的联合类型使用场景是处理 API 响应。在动态系统中,API 响应可能根据不同情况具有不同的数据结构。通过定义一个涵盖所有可能响应类型的联合类型,开发者可以在保证类型安全的前提下处理这些响应。例如,API 响应可能是带有 data 字段的对象,也可能是一个错误字符串。可以定义类型如下:
type Response = { data: any } | string;这样就能轻松处理成功响应和错误响应,且不牺牲类型安全。
另一个常见场景是处理可选值。例如,一个变量可能持有字符串或 null。使用联合类型 string | null 可以清楚地表明变量可能的取值。
定义联合类型的语法
联合类型允许变量存储不同类型的值,为开发者提供代码灵活性。不同编程语言中定义联合类型的语法有所不同,但目的都是相同的。无论是使用管道符号分隔类型,还是使用 union 或 variant 等关键字,理解联合类型的定义语法将有助于编写更通用、更健壮的代码。
使用联合类型组合多种类型
TypeScript 中的联合类型允许你将多种类型组合成单一类型。当你希望变量或参数能够持有不同类型的值时,这非常有用。联合类型既可用于基本类型(如 string 和 number),也适用于更复杂的结构(如接口和数组)。
使用联合类型组合多种类型的方法是:将想要组合的类型用管道操作符 分隔开。例如:
let myVariable: string | number;联合类型为数据结构和函数参数提供了极大的灵活性,让你可以拥有能够存储不同类型值的变量,使代码更灵活、可复用。同时也能定义接受多种类型的函数参数,在需要让函数处理不同数据类型时非常实用。
使用联合类型组合基本类型
TypeScript 中的联合类型允许你将多个基本类型组合成一个类型。当值在运行时可能属于不同类型时,这非常有用。通过定义联合类型,你可以指定变量能够持有联合中任意一种类型的值。
组合基本类型的步骤:
- 定义联合类型:使用竖线 操作符分隔基本类型。例如
string | number表示可以是字符串或数字。 - 声明变量:使用联合类型作为变量的类型注解。例如
let myVariable: string | number; - 赋值:给变量赋一个符合联合类型中某一种类型的值。例如
myVariable = "hello"; - 使用变量:根据需要使用该变量,可以执行在联合类型中所有类型都合法的操作。
示例:
let myVariable: string | number;myVariable = "hello";console.log(myVariable.length); // 输出: 5myVariable = 42;console.log(myVariable.toFixed(2)); // 输出: 42.00在这个例子中,myVariable 可以是字符串或数字。先赋值为字符串时可以访问 length,重新赋值为数字后可以调用 toFixed。
使用联合类型组合对象类型
在 TypeScript 中使用联合类型组合对象类型,允许开发者通过将多个已有对象类型用 连接,创建一个新的对象类型。
例如,考虑两种对象类型 Person 和 Employee:
type Person = { name: string; age: number;};
type Employee = { id: number; department: string;};
type PersonOrEmployee = Person | Employee;PersonOrEmployee 是一个联合类型,可以持有 Person 或 Employee 类型的值:
const person: PersonOrEmployee = { name: "John", age: 25,};
const employee: PersonOrEmployee = { id: 1, department: "IT",};使用联合类型组合对象类型的好处有两方面:一是可以在单个变量或函数参数中灵活处理不同对象类型;二是能编写更简洁、更具表达力的代码,避免冗余的类型检查和转换。
使用联合类型组合字面量类型
通过联合类型组合多个字面量类型(字符串字面量或数字字面量),开发者可以创建更加具体、精确的类型。使用 操作符连接多个字面量,可以定义一个只接受特定值的类型,从而加强类型检查,并为开发者和 IDE 提供更准确的类型信息。
这种组合字面量类型的联合常用于:
- 定义函数参数的可选值集合
- 指定变量的预期取值范围
- 实现更严格的类型约束
联合类型的类型检查
在使用 TypeScript 的联合类型时,了解如何“收窄”(narrow)联合类型非常重要,这样才能安全地访问只存在于联合中部分类型上的属性或方法。TypeScript 提供了多种技术来根据代码结构推断出更具体的类型。
常用的收窄方式包括:
- 使用
typeof操作符:在运行时检查值的类型 - 使用
Array.isArray方法:判断是否为数组
例如,对于类型 string | number[] 的变量,可以通过 typeof 和 Array.isArray 分别收窄为字符串或数字数组,从而安全地使用对应类型特有的方法。
联合类型的类型收窄
TypeScript 中联合类型的类型收窄(Type Narrowing),是指根据某些条件将联合类型中的变量收窄为更具体的单一类型。
常见收窄方式:
- 使用
typeof操作符 示例:typeof value === 'string'→ 收窄为string - 使用
instanceof操作符 示例:animal instanceof Dog→ 收窄为 Dog - 使用自定义类型守卫(Type Guard) 类型守卫是一个返回布尔值的函数,用于在运行时判断类型。例如:
function isString(value: any): value is string { return typeof value === "string";}检查联合类型中的共有属性
联合类型允许变量持有不同类型的值。在处理联合类型时,经常需要找出联合中所有类型都共有的属性,这样才能安全地对联合类型的值执行某些操作,而不会引发类型错误。
使用联合类型的模式匹配
TypeScript 中的模式匹配(Pattern Matching)与联合类型结合使用,可以高效地处理多种类型的值,并针对不同类型执行特定逻辑。
实现模式匹配的常见步骤:
- 定义联合类型(例如
Shape = Circle | Square) - 使用类型守卫(
typeof、instanceof或可辨识联合的discriminant属性) - 为每种具体类型编写对应的处理逻辑
使用“模式匹配对象”来处理字符串或数字字面量的联合类型,能提供更简洁、可读性更好的写法,避免冗长的 switch 或 if-else 链。
使用 switch 语句处理联合类型
在 TypeScript 中,switch 语句可以很好地与联合类型配合使用,来处理多种可能的类型。
示例:
function processResult(result: string | number): void { switch (typeof result) { case "string": console.log("The result is a string: " + result); break; case "number": console.log("The result is a number: " + result); break; default: console.log("Unknown type"); }}使用 switch 处理联合类型的好处包括:
- 代码简洁、可读性好
- 更好的代码组织与维护性
- 编译器能强制检查是否处理了联合类型中的所有可能情况(穷尽性检查)
- 容易扩展——新增类型时改动较小
根据输入类型在函数中处理不同情况
在编写函数时,必须考虑输入可能具有的不同类型,并针对每种情况正确处理,才能保证函数在各种场景下行为正确。
类型别名与联合类型
类型别名(Type Alias)允许我们为任何类型(包括对象类型、联合类型等)起一个名字。通过有意义的名称来引用复杂的类型,可以大大提高代码可读性。
需要注意的是:类型别名只是别名,并不会创建新的、独立的类型。修改原始类型也会影响通过别名引用的类型,因为它们本质上是同一个类型。
类型别名与联合类型结合使用特别方便。可以把一个较长的联合类型定义一次,然后在整个代码库中通过别名重复引用,避免重复书写,提高代码整洁度和可维护性。
部分信息可能已经过时









