TypeScript 从入门到进阶之基础篇(六) 类型(断言 、推论、别名)| 联合类型 | 交叉类型
系列文章目录
TypeScript 从入门到进阶系列
- TypeScript 从入门到进阶之基础篇(一) ts基础类型篇
- TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇
- TypeScript 从入门到进阶之基础篇(三) 元组类型篇
- TypeScript 从入门到进阶之基础篇(四) symbol类型篇
- 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命令用于显示文件的详细信息,包括文件的权限、所有者、大小、修改时间等。 #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的预编译版貌似有问题,使用源码安装试试 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操作系统上搭建的服务器环境组合,由Apache、MySQL、PHP三种软件构成。这种环境是开源的,跨平台的,并且由于各组件经常一起使用,因此具有高度的兼容性。 其中,Apac…...

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

如何做一个炫酷的Github个人简介(3DContribution)
文章目录 前言3D-Contrib第一步第二步第三步第四步第五步第六步 前言 最近放假了,毕设目前也不太想做,先搞一点小玩意玩玩,让自己的github看起来好看点。也顺便学学这个action是怎么个事。 3D-Contrib 先给大家看一下效果 我的个人主页&am…...
基于单片机的护理床控制器设计
一、摘要 随着科技的不断发展,人们对生活质量的要求越来越高,特别是在医疗保健领域。护理床作为医院病房中常见的设备,其功能和性能直接影响到患者的康复进程。本文主要介绍了一种基于单片机的护理床控制器设计,该控制器可以实现…...

《3D数学基础-图形和游戏开发》阅读笔记 | 3D数学基础 (学习中 1.6更新)
文章目录 3D数学基础矢量/向量什么是向量点与矢量的关系 向量基础运算 向量加法向量基础运算 数乘 线性组合 - 坐标系的基如果选择不同的基向量会怎么样?- 张成(Span)的空间三维向量的张成空间线性相关与线性相关 矩阵与线性变换矩阵-几何意义线性变换矩阵乘法与线性…...

解锁测试性能瓶颈:深度探讨JMeter分布式性能测试!
在做后端服务器性能测试中,我们会经常听到分布式。但你是否了解分布式呢?今天,我们就来给大家讲讲,在企业实战中,如何使用分布式进行性能测试,实战过程中,又有哪些地方要特别注意? 0…...

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

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

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

Vue中使用Element UI的Table组件实现嵌套表格(最简单示例)
以下是一个简单的示例代码,演示如何在Vue中使用Element UI的Table组件实现嵌套表格: html <template><div><el-table :data"tableData" style"width: 100%"><el-table-column prop"name" label&quo…...
如何使用RESTful API构建 web 应用程序
RESTful API 是一种设计风格,用于构建可扩展、灵活和可维护的 web 应用程序。它是一种基于 HTTP 协议的架构风格,旨在提供一组规范和约束,以便客户端和服务器之间的通信更加简单和可预测。 RESTful API 通过使用 HTTP 动词来定义资源的操作&…...

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

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

有什么安全处理方案可以有效防护恶意爬虫
常见的爬虫 有百度爬虫、谷歌爬虫、必应爬虫等搜索引擎类爬虫,此类爬虫经常被企业用于提高站点在搜索引擎内的自然排名,使得站点在各大搜索引擎中的排名能够提高,进一步通过搜索引擎来进行引流为企业增加业务流量。 恶意爬虫与合法、合规的搜…...

Flutter3.X基础入门教程(2024完整版)
Flutter介绍: Flutter是谷歌公司开发的一款开源、免费的UI框架,可以让我们快速的在Android和iOS上构建高质量App。它最大的特点就是跨平台、以及高性能。 目前Flutter已经支持 iOS、Android、Web、Windows、macOS、Linux的跨平台开发。 教程所讲内容支持…...
GEE——土地利用分类种两个矢量集合中不同列进行相减的方式(利用join进行连接处理)
问题: 我有两个具有相同 ID 的特征集,我想从第二个特征集中减去第一个特征集的表格单元格。 我使用了这个函数,但它计算的是表 1 中第一个元素与表 2 中其他元素的减法。 我想逐个单元格计算减法。第一个表格中 id 为 1 的单元格减去第二个表格中 id 为 1 的单元格,2x2、…...

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

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...