一文读懂TS 中联合类型和交叉类型各自的含义

一文读懂 TS 中联合类型和交叉类型各自的含义

在 TypeScript 中,联合类型和交叉类型是两种非常重要的概念。它们可以帮助我们更好地描述类型,提高代码的清晰度和健壮性。接下来我们将详细讲解这两种类型的含义和用法。

联合类型

联合类型(Union Types)表示一个值可以是多种类型中的一种。用 | 符号连接多个类型,表示这些类型是可选的,例如:

let val: string | number;
val = 'hello'; // 正确
val = 123; // 也正确
val = true; // 错误,布尔值不是 string 或 number

上面的代码定义了一个变量 val,它可以是 stringnumber 类型。这样的类型声明可以在很多场景下帮我们描述变量的类型范围,例如文字常量或者字符串类型。

用在函数中

联合类型也可以用在函数中,表示函数的参数或返回值可以是多种类型中的一种,例如:

function fn(val: string | number): void {
  console.log(val.toFixed(2)); // 错误,因为 val 不一定是 number 类型
  console.log(val.substr(1)); // 错误,因为 val 不一定是 string 类型
  console.log(String(val).substr(1)); // 正确,把 val 转换为 string 类型后再调用 substr
}

fn('hello'); // 正确
fn(123); // 也正确
fn(true); // 错误,布尔值不是 string 或 number

上面的代码定义了一个函数 fn,它的参数 val 可以是 stringnumber 类型。由于 val 不确定是哪种类型,我们不能直接使用它的字符串或数值操作方法,需要先进行类型转换。

用在类型保护中

当我们使用联合类型时,编译器无法确定一个变量到底是哪种类型,我们需要使用类型保护(Type Guards)来明确变量的类型。例如:

function process(val: string | number): string {
  if (typeof val === 'string') {
    return val.toUpperCase();
  } else if (typeof val === 'number') {
    return val.toFixed(2);
  }
  throw new Error('unsupported type');
}

console.log(process('hello')); // 输出 'HELLO'
console.log(process(3.1415926)); // 输出 '3.14'
console.log(process(true)); // 抛出错误,因为布尔值不是 string 或 number

上面的代码定义了一个函数 process,它的参数 val 可以是 stringnumber 类型。在函数实现中,我们使用 typeof 来判断 val 的类型,然后分别处理。这样我们就可以安全地使用字符串和数值操作方法了。

交叉类型

交叉类型(Intersection Types)表示一个值需要同时属于多个类型。用 & 符号连接多个类型,表示这些类型是必须同时满足的,例如:

interface Person {
  name: string;
  age: number;
}

interface Employee {
  company: string;
  salary: number;
}

type Worker = Person & Employee;

const worker: Worker = {
  name: 'John',
  age: 30,
  company: 'ABC Inc.',
  salary: 5000
};

上面的代码定义了两个接口 PersonEmployee,它们分别表示一个人和一个员工。然后我们定义了一个类型 Worker,表示同时具有 PersonEmployee 的特性。

在定义变量 worker 时,我们可以看到它同时包含了 PersonEmployee 的所有属性,这样我们就可以方便地使用这个变量了。

用在类型合并中

交叉类型不仅可以用于定义变量,还可以用于合并类型。例如:

interface A {
  a: number;
}

interface B {
  b: string;
}

interface C {
  c: boolean;
}

type ABC = A & B & C;

const abc: ABC = {
  a: 123,
  b: 'hello',
  c: true
};

上面的代码定义了三个接口 ABC,它们分别表示三种不同的特性。然后我们定义了一个类型 ABC,表示同时具有三种特性的对象。

在定义变量 abc 时,我们可以看到它同时包含了 ABC 的所有属性,这样就可以方便地使用这个变量了。交叉类型在对类型进行合并时非常方便,我们可以将多个接口组合成一个单一的接口,从而达到代码重用的目的。

总结

联合类型和交叉类型是 TypeScript 中非常重要的概念,它们分别用来表示一个值可以是多种类型中的一种和一个值需要同时属于多个类型。这两个类型可以很好地描述变量的类型范围和属性需求,将它们组合使用可以使代码更加清晰健壮。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文读懂TS 中联合类型和交叉类型各自的含义 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • vue使用fengMap速度慢的原因分析

    题目要求分析vue使用fengMap速度慢的原因,那么我们就需要具体分析vue与fengMap在集成和使用中可能存在的问题。以下是可能存在的原因和解决方法: 原因分析一:Vue组件过多 可能会存在vue组件过多导致页面渲染缓慢的问题。在使用fengMap时,我们需要引用fengMap的JS和CSS文件,同时使用fengMap提供的组件来完成我们需要的业务功能…

    JavaScript 2023年6月10日
    00
  • JS数组Array常用方法汇总+实例

    JS数组Array常用方法汇总+实例 在JavaScript中,数组是一种非常重要的数据类型。它可以用来存储多个值,并且可以通过下标来访问和修改数组中的元素。JavaScript提供了很多常用的数组方法,可以使数组的操作更加方便快捷。下面我们就来详细讲解一下这些常用的数组方法。 一、创建数组 要创建一个数组,有多种方式: 1. 直接声明 let arr1 =…

    JavaScript 2023年5月27日
    00
  • JS字符串拼接的几种常见方式总结

    下面是对于JS字符串拼接的几种常见方式总结的攻略,包含以下内容: 方式一:使用加号(+)拼接字符串 加号(+)是最常见的字符串拼接方式,具体语法如下: let str = ‘Hello, ‘ + ‘world!’; 其中,单引号(’)或双引号(”)用来包裹字符串内容,加号(+)用来拼接字符串,可以看到在以上例子中,我们通过加号把两个字符串连接了起来。 值得注…

    JavaScript 2023年5月28日
    00
  • 浅谈JSON5解决了JSON的两大痛点

    让我详细地讲解一下“浅谈JSON5解决了JSON的两大痛点”的完整攻略。 背景介绍 首先,让我们来了解一下 JSON5 背后的背景。JSON(JavaScript Object Notation)是一种常用的数据交换格式,用于存储和传输简单和复杂的数据。JSON 这种格式的优点在于它的可读性、易于解析和在 Web 应用程序和 API 中的广泛使用。然而,在实…

    JavaScript 2023年5月27日
    00
  • js几秒以后倒计时跳转示例

    下面我将为您提供“js几秒以后倒计时跳转示例”的完整攻略。 示例一:使用window.setTimeout()方法实现倒计时跳转 首先,在HTML页面中添加一个div元素,用于显示倒计时的时间: <div id="countdown">5</div> 接下来,添加以下JavaScript代码: // 获取倒计时di…

    JavaScript 2023年5月27日
    00
  • JavaScript Reduce使用详解

    JavaScript Reduce使用详解 在JavaScript中,数组的reduce方法可以让我们使用自定义的函数将数组中的所有元素汇总为一个值,该值既可以是一个数字,也可以是一个对象或数组。 reduce方法的语法 reduce方法的语法如下: array.reduce(callback[, initialValue]) 其中,参数callback为一…

    JavaScript 2023年5月27日
    00
  • 微信小程序 数据封装,参数传值等经验分享

    下面将详细讲解“微信小程序 数据封装,参数传值等经验分享”的完整攻略。 数据封装 在微信小程序中,不同的功能模块之间经常需要相互传递数据。但是为了提高程序的健壮性和可维护性,应该对数据进行封装。 一般而言,数据封装的实现方式有:函数返回值、全局变量、对象封装等。 函数返回值 函数返回值是最简单的数据封装方法。在通过函数调用获取返回结果时,可以将函数需要返回的…

    JavaScript 2023年6月11日
    00
  • JavaScript数组reduce()方法

    我们来详细讲解一下JavaScript数组reduce()方法的完整攻略。 简介 reduce() 方法是JavaScript数组的一个非常强大的方法,它可以将一个数组中的所有元素依次执行一个回调函数,并将最终结果返回。在实际应用中,这个方法非常多样化,能够应用于各种情景。 基本语法 reduce() 方法的基本语法如下: array.reduce(func…

    JavaScript 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部