当前位置: 首页 > news >正文

TypeScript 从入门到进阶之基础篇(六) 类型(断言 、推论、别名)| 联合类型 | 交叉类型

在这里插入图片描述

系列文章目录

TypeScript 从入门到进阶系列

  1. TypeScript 从入门到进阶之基础篇(一) ts基础类型篇
  2. TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇
  3. TypeScript 从入门到进阶之基础篇(三) 元组类型篇
  4. TypeScript 从入门到进阶之基础篇(四) symbol类型篇
  5. TypeScript 从入门到进阶之基础篇(五) 枚举类型篇
    持续更新中…

文章目录

  • 系列文章目录
  • TypeScript 从入门到进阶系列
  • 前言
  • 一、联合类型
  • 二、交叉类型
  • 类型(断言 、推论、别名) 面试常问
    • 1、类型断言(重点)
      • 1.1、 尖括号语法:
      • 1.2、 as语法:
    • 2、类型推论
    • 3、类型别名


前言

在一到五章,我们学习了在TypeScript 中 定义和使用各种类型 ,本章我们来学习TypeScript 在 类型(断言 、推论、别名)| 联合类型 | 交叉类型
请注意 本章内容 可能会出现在你面试时的面试题 是面试题常问的内容


一、联合类型

在 TypeScript 中,联合类型是指可以同时具有多个类型的类型。它使用 | 符号来表示多个类型之间的联合关系。
联合类型的变量可以接受其中任意一个类型的值。

例如,可以定义一个变量,它可以接受 string 或 number 类型的值:

let myVariable: string | number;

这样,myVariable 变量可以被赋值为一个字符串或一个数字,如下所示:

myVariable = "Hello World";
myVariable = 123;

联合类型在函数参数、返回值以及变量声明等场景中非常有用。它可以增加代码的灵活性,使得代码更加健壮和可维护。

二、交叉类型

在TypeScript中,交叉类型(Intersection
Types)是一种组合多个类型的方式。交叉类型可以将多个类型合并成一个类型,从而具备合并类型的所有特性。

交叉类型使用&符号表示,例如type A = B & C;,表示类型A是同时具备类型B和类型C的属性和方法。

交叉类型的作用是将多个类型的特性合并在一起,使得一个对象具备多个类型的属性和方法。举个例子,假设有一个接口A表示可触发事件的对象,以及一个接口B表示可拖拽的对象,可以通过交叉类型将两个接口合并成一个新的接口C,表示既可以触发事件又可拖拽的对象。

interface A {on(event: string, callback: () => void): void;
}interface B {drag(): void;
}type C = A & B;const obj: C = {on(event, callback) {// 触发事件的逻辑},drag() {// 拖拽的逻辑}
};

通过上述例子可以看出,交叉类型可以让对象具备多个类型的特性,并且可以通过类型注解来保证对象满足合并类型的要求。

类型(断言 、推论、别名) 面试常问

1、类型断言(重点)

在 TypeScript 中,类型断言(Type Assertion)是一种告诉编译器某个值的类型的方式。类型断言可以在编译时确定某个值的类型,方便进行类型检查和类型推断。

有两种形式的类型断言:

1.1、 尖括号语法:

let str: any = "hello";
let length: number = (<string>str).length;

在尖括号内指定要断言的类型,在这个例子中断言 str 是一个字符串类型。编译器会将 str 的类型视为 string,从而可以调用 length 属性。

1.2、 as语法:

let str: any = "hello";
let length: number = (str as string).length;

使用 as 关键字,将要断言的类型放在 as 的后面。这个例子与上面的例子是等效的。

需要注意的是,类型断言只会在编译时起作用,不会改变原始值的类型。所以在进行类型断言时要确保断言的类型是正确的,否则可能会导致类型错误。

2、类型推论

在TypeScript中,类型推论是指 TypeScript编译器自动根据变量的初始值推断其类型的过程。当你声明一个变量并赋予初始值时,TypeScript编译器会根据这个初始值的类型来推断该变量的类型。

例如,当你声明一个变量并直接赋值一个数字时:

let num = 10;//注意 如果你定义了一个类型 但没有给其赋值
//那么 a 的类型为 any
let a;

TypeScript 编译器会根据初始值 10 推断出 num 的类型为 number。这样,在后续的代码中,你就可以使用 num 作为一个数字类型的变量,并且编译器会对相关的类型进行检查。

又例如,vue3中 ref 的使用 在赋值时会自动推论类型

const bool=ref(true)
const str=ref('类型')

类型推论的好处是可以减少手动类型注解的工作量,并且使代码更简洁。然而,当初始值无法明确推断出类型时,你可能需要手动添加类型注解来指定变量的类型。

3、类型别名

在 TypeScript 中,类型别名(Type Alias)允许我们给一个类型起一个新的名字。通过使用类型别名,我们可以用一个简洁的名称来表示复杂的类型。

类型别名可以用来命名任何类型,包括原始类型(如字符串、数字等),联合类型,交叉类型,对象类型等。比如:

type MyString = string;
type MyNumber = number;
type MyBoolean = boolean;// 联合类型
type MyUnion = string | number;// 交叉类型
type MyIntersection = MyNumber & MyBoolean;// 对象类型
type MyObject = {prop1: string;prop2: number;
};

使用类型别名可以增加代码的可读性和可维护性,特别是在处理复杂的类型时。类型别名的语法是 type 关键字加上一个名称,后面紧跟等号和类型定义。

类型别名还可以用于定义泛型类型,函数类型等。通过使用类型别名,我们可以将复杂的类型定义简化为一个具有描述性的名称,提高代码的可读性和可理解性。

相关文章:

TypeScript 从入门到进阶之基础篇(六) 类型(断言 、推论、别名)| 联合类型 | 交叉类型

系列文章目录 TypeScript 从入门到进阶系列 TypeScript 从入门到进阶之基础篇(一) ts基础类型篇TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇TypeScript 从入门到进阶之基础篇(三) 元组类型篇TypeScript 从入门到进阶之基础篇(四) symbol类型篇TypeScript 从入门到进阶…...

Linux操作系统基础(14):文件管理-文件属性命令

1. 查看文件属性 stat命令用于显示文件的详细信息&#xff0c;包括文件的权限、所有者、大小、修改时间等。 #1.显示文件信息 stat file.txt#2.显示文件系统状态 stat -f file.txt#3.显示以时间戳的形式文件信息 stat -t file.txt2. 修改文件时间戳 touch命令用于创建新的空…...

metaSPAdes,megahit,IDBA-UB:宏基因组装软件安装与使用

metaSPAdes,megahit,IDBA-UB是目前比较主流的宏基因组组装软件 metaSPAdes安装 GitHub - ablab/spades: SPAdes Genome Assembler #3.15.5的预编译版貌似有问题&#xff0c;使用源码安装试试 wget http://cab.spbu.ru/files/release3.15.5/SPAdes-3.15.5.tar.gz tar -xzf SP…...

Apache、MySQL、PHP编译安装LAMP环境

1. 请简要介绍一下LAMP环境。 LAMP环境是一个在Linux操作系统上搭建的服务器环境组合&#xff0c;由Apache、MySQL、PHP三种软件构成。这种环境是开源的&#xff0c;跨平台的&#xff0c;并且由于各组件经常一起使用&#xff0c;因此具有高度的兼容性。 其中&#xff0c;Apac…...

L1-087:机工士姆斯塔迪奥

题目描述 在 MMORPG《最终幻想14》的副本“乐欲之所瓯博讷修道院”里&#xff0c;BOSS 机工士姆斯塔迪奥将会接受玩家的挑战。 你需要处理这个副本其中的一个机制&#xff1a;NM 大小的地图被拆分为了 NM 个 11 的格子&#xff0c;BOSS 会选择若干行或/及若干列释放技能&#x…...

如何做一个炫酷的Github个人简介(3DContribution)

文章目录 前言3D-Contrib第一步第二步第三步第四步第五步第六步 前言 最近放假了&#xff0c;毕设目前也不太想做&#xff0c;先搞一点小玩意玩玩&#xff0c;让自己的github看起来好看点。也顺便学学这个action是怎么个事。 3D-Contrib 先给大家看一下效果 我的个人主页&am…...

基于单片机的护理床控制器设计

一、摘要 随着科技的不断发展&#xff0c;人们对生活质量的要求越来越高&#xff0c;特别是在医疗保健领域。护理床作为医院病房中常见的设备&#xff0c;其功能和性能直接影响到患者的康复进程。本文主要介绍了一种基于单片机的护理床控制器设计&#xff0c;该控制器可以实现…...

《3D数学基础-图形和游戏开发》阅读笔记 | 3D数学基础 (学习中 1.6更新)

文章目录 3D数学基础矢量/向量什么是向量点与矢量的关系 向量基础运算 向量加法向量基础运算 数乘 线性组合 - 坐标系的基如果选择不同的基向量会怎么样&#xff1f;- 张成(Span)的空间三维向量的张成空间线性相关与线性相关 矩阵与线性变换矩阵-几何意义线性变换矩阵乘法与线性…...

解锁测试性能瓶颈:深度探讨JMeter分布式性能测试!

在做后端服务器性能测试中&#xff0c;我们会经常听到分布式。但你是否了解分布式呢&#xff1f;今天&#xff0c;我们就来给大家讲讲&#xff0c;在企业实战中&#xff0c;如何使用分布式进行性能测试&#xff0c;实战过程中&#xff0c;又有哪些地方要特别注意&#xff1f; 0…...

SiC电机控制器(逆变器)发展概况及技术方向

SiC电机控制器&#xff08;逆变器&#xff09;发展概况及技术方向 1.概述2.电动汽车动力系统设计趋势3.栅极驱动器和驱动电源配置4.结论 tips&#xff1a;资料来自网上搜集&#xff0c;仅供学习使用。 1.概述 2022年到2023年&#xff0c;第三代半导体碳化硅被推上了新的热潮。…...

useContext

可以跨组件传值 其实主要的就是三步 1、const xxx React.createContext();创建一个context 2、<xxx.Provider value{{ num, setNum }}>父组件设置要传递的值 3、const { num, setNum } React.useContext(xxx);子组件下使用 特点&#xff1a; 1、可以有多个xxx.Pr…...

Java数据结构:1. 数据结构前置知识

文章目录 一、初识数据结构二、初识集合框架1. 什么是集合框架2. 集合框架的重要性3. 背后所涉及的数据结构以及算法 三、时间复杂度空间复杂度1. 算法效率2. 时间复杂度&#xff08;1&#xff09;概念&#xff08;2&#xff09;大O的渐进表示法&#xff08;3&#xff09;推导大…...

Vue中使用Element UI的Table组件实现嵌套表格(最简单示例)

以下是一个简单的示例代码&#xff0c;演示如何在Vue中使用Element UI的Table组件实现嵌套表格&#xff1a; html <template><div><el-table :data"tableData" style"width: 100%"><el-table-column prop"name" label&quo…...

如何使用RESTful API构建 web 应用程序

RESTful API 是一种设计风格&#xff0c;用于构建可扩展、灵活和可维护的 web 应用程序。它是一种基于 HTTP 协议的架构风格&#xff0c;旨在提供一组规范和约束&#xff0c;以便客户端和服务器之间的通信更加简单和可预测。 RESTful API 通过使用 HTTP 动词来定义资源的操作&…...

开启Android学习之旅-4-Android集成FontAwesome

FontAwesome 是一个非常标准、统一风格的图标库。产品经理在原型中应用了很多图标都是FontAwesome。正常流程是 UI 需要再手工绘制或在 iconfont 或 iconpark 网站挨个找&#xff0c;如果在 Android 直接使用不是省了一步&#xff08;注意版权问题&#xff0c;使用免费版&#…...

Qt——TCP UDP网络编程

目录 前言正文一、TCP二、UDP1、基本流程2、必备知识 三、代码层级1、UDP服务端 END、总结的知识与问题1、如何获取QByteArray中某一字节的数据&#xff0c;并将其转为十进制&#xff1f;2、如何以本年本月本日为基础&#xff0c;获取时间戳&#xff0c;而不以1970为基础&#…...

有什么安全处理方案可以有效防护恶意爬虫

常见的爬虫 有百度爬虫、谷歌爬虫、必应爬虫等搜索引擎类爬虫&#xff0c;此类爬虫经常被企业用于提高站点在搜索引擎内的自然排名&#xff0c;使得站点在各大搜索引擎中的排名能够提高&#xff0c;进一步通过搜索引擎来进行引流为企业增加业务流量。 恶意爬虫与合法、合规的搜…...

Flutter3.X基础入门教程(2024完整版)

Flutter介绍&#xff1a; Flutter是谷歌公司开发的一款开源、免费的UI框架&#xff0c;可以让我们快速的在Android和iOS上构建高质量App。它最大的特点就是跨平台、以及高性能。 目前Flutter已经支持 iOS、Android、Web、Windows、macOS、Linux的跨平台开发。 教程所讲内容支持…...

GEE——土地利用分类种两个矢量集合中不同列进行相减的方式(利用join进行连接处理)

问题: 我有两个具有相同 ID 的特征集,我想从第二个特征集中减去第一个特征集的表格单元格。 我使用了这个函数,但它计算的是表 1 中第一个元素与表 2 中其他元素的减法。 我想逐个单元格计算减法。第一个表格中 id 为 1 的单元格减去第二个表格中 id 为 1 的单元格,2x2、…...

mnn-llm: 大语言模型端侧CPU推理优化

在大语言模型(LLM)端侧部署上&#xff0c;基于 MNN 实现的 mnn-llm 项目已经展现出业界领先的性能&#xff0c;特别是在 ARM 架构的 CPU 上。目前利用 mnn-llm 的推理能力&#xff0c;qwen-1.8b在mnn-llm的驱动下能够在移动端达到端侧实时会话的能力&#xff0c;能够在较低内存…...

Freemarker实现Html全站静态化

全站静态化 在大型网站中&#xff0c;比如主流电商商品页&#xff0c;访问者看到的页面基本上是静态页面。为什么都要把页面静态化呢&#xff1f;其实把页面静态化&#xff0c;好处有很多。例如&#xff1a;访问速度快&#xff0c;更有利于搜索引擎收录等。 目前主流的静态化…...

16.顺子日期(14)

题目 public class Main {public static boolean isLegal(String date) {int l 0;int n date.length();while(l<(n-3)) {int t1 (int)Integer.valueOf(date.substring(l,l1));int t2 (int)Integer.valueOf(date.substring(l1,l2));int t3 (int)Integer.valueOf(date.s…...

《动手学深度学习》学习笔记 第5章 深度学习计算

本系列为《动手学深度学习》学习笔记 书籍链接&#xff1a;动手学深度学习 笔记是从第四章开始&#xff0c;前面三章为基础知道&#xff0c;有需要的可以自己去看看 关于本系列笔记&#xff1a; 书里为了让读者更好的理解&#xff0c;有大篇幅的描述性的文字&#xff0c;内容很…...

【Redis】非关系型数据库之Redis的介绍及安装配置

目录 前言 一、关系型数据库与非关系型数据库 1.1关系型数据库 1.2非关系型数据库 1.3两者的区别 1.4非关系型数据库产生的背景 1.5总结 二、Redis介绍 2.1Redis是什么 2.2Redis的优点 2.3Redis的使用场景 2.4那些数据适合放在缓存中 2.5Redis为什么那么快&#xf…...

3D模型轻量化

在线工具推荐&#xff1a;3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 近来&#xff0c;基于3D模型在影视作品、数字旅游项目诸多3D视觉领域都取得…...

数据分析——快递电商

一、任务目标 1、任务 总体目的——对账 本项目解决同时使用多个快递发货&#xff0c;部分隔离区域出现不同程度涨价等情形下&#xff0c;如何快速准确核对账单的问题。 1、在订单表中新增一列【运费差异核对】来表示订单运费实际有多少差异&#xff0c;结果为数值。 2、将…...

《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(8)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置&#xff08;7&#xff09; 2.2 HOST主桥 MPC8548处理器的拓扑结构如图2-2所示&#xff1a; 2.2.2 存储器域地址空间到PCI总线域地址空间的转换 MPC8548处理器使用ATMU&#xff…...

Hadoop分布式文件系统(二)

目录 一、Hadoop 1、文件系统 1.1、文件系统定义 1.2、传统常见的文件系统 1.3、文件系统中的重要概念 1.4、海量数据存储遇到的问题 1.5、分布式存储系统的核心属性及功能含义 2、HDFS 2.1、HDFS简介 2.2、HDFS设计目标 2.3、HDFS应用场景 2.4、HDFS重要特性 2.4…...

macOS跨进程通信: FIFO(有名管道) 创建实例

一&#xff1a; 简介 在类linux系统中管道分为有名管道和匿名管道。两者都能单方向的跨进程通信。 匿名管道&#xff08;pipe&#xff09;: 必须是父子进程之间&#xff0c;而且子进程只能由父进程fork() 出来的&#xff0c;才能继承父进程的管道句柄&#xff0c;一般mac 开发…...

推荐几个免费的HTTP接口Mock网站和工具

在前后端分离开发架构下&#xff0c;经常遇到调用后端数据API接口进行测试、集成、联调等需求&#xff0c;比如&#xff1a; &#xff08;1&#xff09;前端开发人员很快开发完成了UI界面&#xff0c;但后端开发人员的API接口还没有完成&#xff0c;不能进行前后端数据接口对接…...

网站开发应用短信/广东宣布即时优化调整

三、完整集群部署 - kubernetes-with-ca 1. 理解认证授权 1.1 为什么要认证 想理解认证&#xff0c;我们得从认证解决什么问题、防止什么问题的发生入手。防止什么问题呢&#xff1f;是防止有人入侵你的集群&#xff0c;root你的机器后让我们集群依然安全吗&#xff1f;不是吧&…...

做服装网站需要什么/网络销售都是诈骗公司吗

Fedora 中的所有软件都必须从其源代码构建。我们不包括预构建的二进制文件。-- Ankur Sinha "franciscod"在上一篇文章中&#xff0c;我们研究了什么是 RPM 软件包。它们是包含文件和元数据的档案文件。当安装或卸载 RPM 时&#xff0c;此元数据告诉 RPM 在哪里创建或…...

苏州网站建设企业网站制作/蜜雪冰城网络营销案例分析

千里之行始于足下 题目&#xff1a;打印一个数的每一位 要求&#xff1a;递归方式实现打印一个整数的每一位 思路&#xff1a; 首先要了解C语言中函数递归的概念&#xff0c;一个调用自身&#xff08;不管是直接地还是间接地调用&#xff09;的函数被称为函数的递归。&…...

做课件需要的纯音乐网站/手机营销推广方案

1、情况&#xff1a;本地一切正常&#xff0c;部署到线上每当校验格式时&#xff0c;但是里面有报错信息&#xff0c;数字输入框报错红框不展示&#xff08;如果按键删除里面内容会呈现红色的0&#xff09;&#xff0c;如图&#xff1a; 2、问题代码&#xff1a; // columns …...

互联网站长名人/整站优化关键词排名

据市调机构Canalys公布的数据显示&#xff0c;三季度三星在印度智能手机市场取得了第二名&#xff0c;这是它在连续受到中国手机企业压制之下首次取得回升。市调机构Canalys的这份数据显示&#xff0c;三星以20.4%的市场份额位居印度智能手机市场份额第二名&#xff0c;此前位居…...

软文营销文章范文/湖南seo优化价格

2019独角兽企业重金招聘Python工程师标准>>> 客户端——MemStore——列族——Hfile 1、Hbase在执行写操作的时候&#xff0c;首先会将写动作记录在hlog,memstore中&#xff0c;只有在这两个地方都确认完成后才被记录操作成功。 Memstore是内存里面的缓冲区&#xff…...