mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
2702 字
7 分钟
TypeScript联合类型
2026-03-06

联合类型(Union Types) 允许变量持有多种类型的值,使开发者能够存储不同类型的数据。使用符号 来表示联合类型,用以分隔变量可以持有的各种类型。

例如,假设我们有一个名为 value 的变量,它可以存储字符串或数字。在这种情况下,value 的联合类型就是 string | number。这表示 value 可以被赋值为字符串或数字。

通过使用联合类型,开发者可以创建更灵活的代码,能够处理多种数据类型。联合类型增强了类型检查,有助于在处理可能具有多种类型的变量时防止错误。

联合类型的定义#

在 TypeScript 中,联合类型允许你定义一个变量或函数参数,使其可以持有多种类型的值。这提供了处理数据的灵活性,让你无需类型转换或大量条件判断即可处理不同类型的值。

定义联合类型时,使用管道符号 分隔想要包含的类型。例如,你可以声明一个类型为 number | string 的变量,这意味着它可以持有数字或字符串值。

联合类型可以组合基本类型(如 numberstringboolean 等),也可以组合更复杂的结构,如接口、数组,甚至其他联合类型。例如,你可以定义类型为 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 中的联合类型允许你将多个基本类型组合成一个类型。当值在运行时可能属于不同类型时,这非常有用。通过定义联合类型,你可以指定变量能够持有联合中任意一种类型的值。

组合基本类型的步骤:

  1. 定义联合类型:使用竖线 操作符分隔基本类型。例如 string | number 表示可以是字符串或数字。
  2. 声明变量:使用联合类型作为变量的类型注解。例如 let myVariable: string | number;
  3. 赋值:给变量赋一个符合联合类型中某一种类型的值。例如 myVariable = "hello";
  4. 使用变量:根据需要使用该变量,可以执行在联合类型中所有类型都合法的操作。

示例:

let myVariable: string | number;
myVariable = "hello";
console.log(myVariable.length); // 输出: 5
myVariable = 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[] 的变量,可以通过 typeofArray.isArray 分别收窄为字符串或数字数组,从而安全地使用对应类型特有的方法。

联合类型的类型收窄#

TypeScript 中联合类型的类型收窄(Type Narrowing),是指根据某些条件将联合类型中的变量收窄为更具体的单一类型。

常见收窄方式:

  1. 使用 typeof 操作符 示例:typeof value === 'string' → 收窄为 string
  2. 使用 instanceof 操作符 示例:animal instanceof Dog → 收窄为 Dog
  3. 使用自定义类型守卫(Type Guard) 类型守卫是一个返回布尔值的函数,用于在运行时判断类型。例如:
function isString(value: any): value is string {
return typeof value === "string";
}

检查联合类型中的共有属性#

联合类型允许变量持有不同类型的值。在处理联合类型时,经常需要找出联合中所有类型都共有的属性,这样才能安全地对联合类型的值执行某些操作,而不会引发类型错误。

使用联合类型的模式匹配#

TypeScript 中的模式匹配(Pattern Matching)与联合类型结合使用,可以高效地处理多种类型的值,并针对不同类型执行特定逻辑。

实现模式匹配的常见步骤:

  1. 定义联合类型(例如 Shape = Circle | Square
  2. 使用类型守卫(typeofinstanceof 或可辨识联合的 discriminant 属性)
  3. 为每种具体类型编写对应的处理逻辑

使用“模式匹配对象”来处理字符串或数字字面量的联合类型,能提供更简洁、可读性更好的写法,避免冗长的 switchif-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)允许我们为任何类型(包括对象类型、联合类型等)起一个名字。通过有意义的名称来引用复杂的类型,可以大大提高代码可读性。

需要注意的是:类型别名只是别名,并不会创建新的、独立的类型。修改原始类型也会影响通过别名引用的类型,因为它们本质上是同一个类型。

类型别名与联合类型结合使用特别方便。可以把一个较长的联合类型定义一次,然后在整个代码库中通过别名重复引用,避免重复书写,提高代码整洁度和可维护性。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

TypeScript联合类型
http://s0ralin.github.io/posts/typescript联合类型/
作者
まつざか ゆき
发布于
2026-03-06
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00