一文读懂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日

相关文章

  • jquery遍历数组与筛选数组的方法

    下面是关于jQuery遍历和筛选数组的方法的详细讲解: 遍历数组 1. each方法 使用each方法遍历数组很简单,只需要将数组作为each方法的参数,然后在回调函数中操作即可。回调函数中可以接收两个参数:元素的索引和元素本身。以下是一个例子: var arr = [‘apple’, ‘banana’, ‘orange’]; $.each(arr, fun…

    JavaScript 2023年5月27日
    00
  • js实现汉字排序的方法

    下面是js实现汉字排序的方法的详细攻略。 准备工作 在实现汉字排序之前需要准备一些工作。 安装JavaScript工具库pinyin。 npm install pinyin –save 引入pinyin工具库。 const pinyin = require(‘pinyin’); 实现步骤 获取待排序汉字数组。 const hanziArr = [‘北京’,…

    JavaScript 2023年5月19日
    00
  • BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑

    Bootstrap是一款常用的前端开发框架,封装了很多常用的功能组件,如表单验证功能。但是在使用Bootstrap的表单验证组件时,我们可能会遭遇一些坑,其中比较典型的就是非Submit类型按钮点击时不能触发表单验证的问题。 下面是解决这个问题的攻略步骤: 步骤1:为非Submit类型按钮添加点击事件 首先,我们需要为非Submit类型按钮添加点击事件。在这…

    JavaScript 2023年6月10日
    00
  • JS常见问题整理(持续更新)

    下面是对“JS常见问题整理(持续更新)”的详细攻略: 一、文档结构 这篇文档是一篇基于 Markdown 格式编写的文档,采用了 h1 到 h3 级别的标题,并且使用了无序列表与有序列表来展示内容。文档采用了代码块、引用块等标记来增加阅读体验。 二、常见问题分类 在这份文档中,常见的问题被分为以下几类: JS 数据类型与数据类型转换 JS 函数 JS 对象 …

    JavaScript 2023年5月18日
    00
  • Android中WebView无法后退和js注入漏洞的解决方案

    一、Android中WebView无法后退的解决方案 问题描述:在Android中使用WebView时,通过back键无法返回上一个网页,点击后退按钮也没有用。 解决方案:Android中WebView默认是不支持返回上一个网页的,需要在WebView中重写onKeyDown方法,当按下back键时,让WebView返回上一个网页。 示例代码: @Overr…

    JavaScript 2023年6月11日
    00
  • js 截取或者替换字符串中的数字实现方法

    下面是详细讲解“js 截取或者替换字符串中的数字实现方法”的完整攻略,步骤如下: 1. 利用正则表达式匹配数字 在 JavaScript 中,可以使用正则表达式来匹配字符串中的数字。以下是一个示例代码: const str = "This is 123456 a string with numbers 789"; const number…

    JavaScript 2023年5月28日
    00
  • js判断当前页面在移动设备还是在PC端中打开

    判断当前页面在移动设备还是在PC端中打开,可以使用JavaScript代码完成。 一、通过UA判断方式进行判断 在JavaScript中,可以通过检测浏览器的user agent(UA)来判断设备是否是移动设备。UA是HTTP协议中的一个头部信息,包括了浏览器的名称、版本、操作系统等信息。移动设备一般会在UA中包含“mobile”、“iPad”、“Andro…

    JavaScript 2023年6月11日
    00
  • 通过JS 获取Mouse Position(鼠标坐标)的代码

    获取鼠标坐标是JavaScript中的常见需求之一,可以通过鼠标事件对象获取鼠标相对于页面的坐标位置。 以下是获取鼠标位置的代码: document.addEventListener(‘mousemove’, (event) => { const mouseX = event.clientX; const mouseY = event.clientY;…

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