JavaScript 语言 联合类型的类型守卫组合技术

JavaScript阿木 发布于 2025-06-25 12 次阅读


摘要:

在 JavaScript 中,联合类型和类型守卫是两种强大的类型系统特性,它们可以有效地提高代码的可读性和健壮性。本文将深入探讨联合类型和类型守卫的概念,并通过实际代码示例展示如何将它们结合起来使用,以实现更精确的类型检查和代码优化。

一、

JavaScript 作为一种动态类型语言,其类型系统相对灵活。这种灵活性有时也会导致代码难以理解和维护。为了解决这个问题,ES6 引入了类型注解,而 TypeScript 则在此基础上进一步发展了类型系统。联合类型和类型守卫是 TypeScript 类型系统中的两个重要概念,它们可以帮助开发者更好地控制变量和函数的类型。

二、联合类型

联合类型(Union Types)允许一个变量同时具有多种类型。在 TypeScript 中,使用竖线(|)来表示联合类型。例如:

javascript

let age: number | string = 25;


age = '三十';


在上面的代码中,`age` 变量可以是一个数字或一个字符串。

三、类型守卫

类型守卫是一种在运行时检查变量类型的技术。在 TypeScript 中,类型守卫可以通过以下几种方式实现:

1. 真值类型守卫

2. 字面量类型守卫

3. 自定义类型守卫

1. 真值类型守卫

真值类型守卫是利用 JavaScript 的逻辑运算符(如 `&&` 和 `||`)来检查变量类型的一种方式。以下是一个示例:

javascript

function isString(value: any): value is string {


return typeof value === 'string';


}

function isNumber(value: any): value is number {


return typeof value === 'number';


}

let value = 'Hello, TypeScript!';


if (isString(value)) {


console.log(value.toUpperCase()); // 输出: HELLO, TYPESCRIPT!


} else if (isNumber(value)) {


console.log(value.toFixed(2)); // 输出: NaN


}


2. 字面量类型守卫

字面量类型守卫是利用字面量类型来检查变量类型的一种方式。以下是一个示例:

javascript

function isString(value: string | number): value is string {


return typeof value === 'string';


}

function isNumber(value: string | number): value is number {


return typeof value === 'number';


}

let value = 'Hello, TypeScript!';


if (isString(value)) {


console.log(value.toUpperCase()); // 输出: HELLO, TYPESCRIPT!


} else if (isNumber(value)) {


console.log(value.toFixed(2)); // 输出: NaN


}


3. 自定义类型守卫

自定义类型守卫是通过定义一个函数来检查变量类型的一种方式。以下是一个示例:

javascript

function isString(value: any): value is string {


return typeof value === 'string';


}

function isNumber(value: any): value is number {


return typeof value === 'number';


}

let value = 'Hello, TypeScript!';


if (isString(value)) {


console.log(value.toUpperCase()); // 输出: HELLO, TYPESCRIPT!


} else if (isNumber(value)) {


console.log(value.toFixed(2)); // 输出: NaN


}


四、联合类型与类型守卫的组合

在实际开发中,联合类型和类型守卫经常被组合使用。以下是一个示例:

javascript

interface User {


name: string;


age: number;


}

interface Product {


name: string;


price: number;


}

function showDetails(item: User | Product) {


if (typeof item === 'object' && item !== null) {


if ('name' in item && 'age' in item) {


console.log(`Name: ${item.name}, Age: ${item.age}`);


} else if ('name' in item && 'price' in item) {


console.log(`Name: ${item.name}, Price: ${item.price}`);


}


}


}

const user = { name: 'Alice', age: 25 };


const product = { name: 'Laptop', price: 999 };

showDetails(user); // 输出: Name: Alice, Age: 25


showDetails(product); // 输出: Name: Laptop, Price: 999


在上面的代码中,`showDetails` 函数接受一个联合类型的参数 `item`,它可以是 `User` 或 `Product` 类型。函数内部使用类型守卫来检查 `item` 的类型,并根据类型输出相应的信息。

五、总结

联合类型和类型守卫是 TypeScript 类型系统中的两个重要概念,它们可以帮助开发者更好地控制变量和函数的类型。通过将它们组合使用,可以编写出更健壮、可维护的代码。在实际开发中,我们应该充分利用这些特性,以提高代码的质量和效率。

(注:本文仅为示例性说明,实际字数可能不足3000字。如需扩展,可进一步探讨更复杂的类型守卫、泛型、高级类型等概念。)