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

yizhihongxing

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

相关文章

  • JS实现的网页倒计时数字时钟效果

    JS实现的网页倒计时数字时钟效果的攻略如下: 需求 我们需要一个Web页面上实现一个倒计时数字时钟效果。 设计思路 生成HTML结构 使用CSS样式美化数字 使用JS实现倒计时功能 使用JS更新HTML内容 HTML代码 <div class="countdown"> <span id="days"&…

    JavaScript 2023年5月27日
    00
  • Javascript 模拟点击事件(点击链接与html点击) 兼容IE/Firefox

    这里是Javascript模拟点击事件(点击链接与HTML点击)兼容IE/Firefox的完整攻略,下面进行详细讲解,并提供两条示例说明。 前置知识 在了解模拟点击事件之前,需要先了解以下概念: 事件冒泡:指当一个元素触发某个事件(例如点击事件)时,此元素的父元素也会受到影响并触发同样的事件。 事件捕捉:指当一个元素触发某个事件时,此元素的父元素可以先于此元…

    JavaScript 2023年6月11日
    00
  • javascript 中的console.log和弹出窗口alert

    当我们编写 JavaScript 代码时,我们经常需要打印调试信息或给用户一些提示信息。这时候,我们可以使用 console.log() 和 alert() 这两个方法。 console.log() console.log() 方法用于打印消息到浏览器的控制台(Console)。我们可以使用它来输出结果、变量、对象等内容。在开发过程中,这是一个非常常用的调试…

    JavaScript 2023年5月28日
    00
  • sso跨域写cookie的一段js脚本(推荐)

    来详细讲解一下“sso跨域写cookie的一段js脚本(推荐)”的完整攻略。 什么是SSO? SSO(Single Sign-On,单点登录),指在多个应用系统中,用户只需登录一次就可以访问所有相互信任的应用系统。 什么是跨域? 跨域是指浏览器禁止通过客户端脚本语言发起对不同源(协议、域名、端口号)的请求。 为什么要跨域写Cookie? 由于浏览器的同源策略…

    JavaScript 2023年6月11日
    00
  • React 条件渲染最佳实践小结(7种)

    React 条件渲染是一个非常常见的操作,在React中也有很多种实现方法。以下就是7种React条件渲染的最佳实践。 1. if…else 第一种方法就是使用if…else实现条件渲染。示例如下: render() { if (someCondition) { return <div>Some JSX</div>; } el…

    JavaScript 2023年6月11日
    00
  • Vue之mixin全局的用法详解

    Vue之mixin全局的用法详解 1. 概述 Vue中的mixin(混入)机制可以让组件之间的代码可以进行复用,即在多组件中共用同一段代码,而不用把这段代码写在多个组件里。这对于代码复用、减少冗余代码是一个非常好的解决方案。mixin可以理解为是一种能够让我们将组件的一部分功能提取出来,并进行重复利用的机制。 2. 语法 下面是mixin的语法: var m…

    JavaScript 2023年6月11日
    00
  • 教你用几十行js实现很炫的canvas交互特效

    关于“教你用几十行js实现很炫的canvas交互特效”的完整攻略,我将从以下几个方面进行详细讲解: 准备工作 在实现交互特效之前,我们需要准备一些必要的工作:首先是引入Canvas标签;其次是编写Canvas绘制所需的HTML、CSS及JavaScript代码;最后还需要确定绘制的内容和样式。 创建画布并绘制基础图形 在Canvas中创建画布并绘制基础图形是…

    JavaScript 2023年6月10日
    00
  • JavaScript中的Number数字类型学习笔记

    我很乐意为您讲解“JavaScript中的Number数字类型学习笔记”的完整攻略。请参考以下内容: JavaScript中的Number数字类型学习笔记 什么是Number类型? 在JavaScript中,Number是一种数字类型,包括整数和浮点数。它可以用来存储任何数字,即使是极大的数字或极小的数字。 如何声明一个Number? 在JavaScript…

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