【TS】TypeScript 联合类型详解:解锁更灵活的类型系统


🌈个人主页: 鑫宝Code
🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础
💫个人格言: "如无必要,勿增实体"
文章目录
- TypeScript 联合类型详解:解锁更灵活的类型系统
- 一、联合类型的定义
- 二、基础用法与类型检查
- 2.1 基础赋值与访问
- 2.2 类型缩小(Type Narrowing)
- 三、联合类型的高级应用场景
- 3.1 函数参数与返回值
- 3.2 泛型与联合类型的结合
- 四、交叉类型与联合类型的对比
- 4.1 联合类型 vs 交叉类型示例
- 五、联合类型的限制与注意事项
- 5.1 属性访问与方法调用
- 5.2 枚举类型的联合
- 六、最佳实践
- 七、结论
TypeScript 联合类型详解:解锁更灵活的类型系统
在TypeScript中,联合类型(Union Types)是一项强大特性,它允许一个变量可能是多个类型中的任意一种。这种灵活性在处理复杂逻辑、函数重载、以及提高代码的可扩展性方面尤为重要。本文将深入探讨联合类型的定义、使用场景、高级技巧以及最佳实践,帮助你全面掌握这一核心概念,进而提升TypeScript项目的质量和开发效率。
一、联合类型的定义
联合类型通过管道符 |
来表示,允许你定义一个变量可以是多种类型之一。例如,一个既可以是字符串也可以是数字的变量可以这样定义:
let myVar: string | number;
这意味着 myVar
可以被赋值为字符串或数字类型的值。
二、基础用法与类型检查
2.1 基础赋值与访问
let mixedValue: string | number;mixedValue = 'Hello'; // 正确
mixedValue = 42; // 也正确// 访问联合类型的成员
if (typeof mixedValue === 'string') {console.log(mixedValue.toUpperCase()); // 类型守卫后,TypeScript知道mixedValue是字符串
} else {console.log(mixedValue.toFixed(2)); // 类型守卫后,TypeScript知道mixedValue是数字
}
2.2 类型缩小(Type Narrowing)
TypeScript提供了几种类型缩小的机制,如类型守卫(type guards)和类型断言,帮助在运行时缩小联合类型变量的可能类型范围,从而安全地访问类型特定的成员。
三、联合类型的高级应用场景
3.1 函数参数与返回值
联合类型在函数签名中非常有用,可以让你定义能处理多种类型输入或输出的函数。
function logValue(value: string | number) {if (typeof value === 'string') {console.log(value.toUpperCase());} else {console.log(value.toFixed(2));}
}logValue('message'); // 输出 MESSAGE
logValue(3.14); // 输出 3.14
3.2 泛型与联合类型的结合
泛型和联合类型可以一起使用,为函数或类提供更灵活的类型支持。
function getLength<T extends string | number>(value: T): number {return typeof value === 'string' ? value.length : value.toString().length;
}console.log(getLength('hello')); // 输出 5
console.log(getLength(123)); // 输出 3
四、交叉类型与联合类型的对比
虽然联合类型和交叉类型(Intersection Types)都涉及多种类型,但它们的用途截然不同。联合类型表示一个值可以是多个类型之一,而交叉类型则是将多个类型的特性合并到一个类型中。
4.1 联合类型 vs 交叉类型示例
-
联合类型:一个变量可以是几种类型中的任意一种。
type Developer = BackendDeveloper | FrontendDeveloper;
-
交叉类型:一个变量具有所有类型的特性。
type FullStackDeveloper = BackendDeveloper & FrontendDeveloper;
五、联合类型的限制与注意事项
5.1 属性访问与方法调用
直接访问联合类型变量的属性或方法可能会导致错误,因为TypeScript无法确定哪个类型的属性或方法应该被访问,除非通过类型守卫或类型断言进行了类型缩小。
5.2 枚举类型的联合
虽然枚举值可以是联合类型的一部分,但枚举类型本身不能直接参与联合,除非通过类型断言或类型守卫间接实现。
六、最佳实践
- 适度使用:联合类型提供了灵活性,但也可能使得代码难以理解。确保每个联合类型都有明确的目的和清晰的使用场景。
- 类型守卫与断言:合理使用类型守卫和类型断言来处理联合类型的变量,提高代码的可读性和安全性。
- 文档注释:在使用联合类型时,适当的注释可以帮助其他开发者理解为什么使用联合类型以及如何安全地处理这些类型。
- 避免过于复杂的联合:过于复杂的联合类型可能会增加理解和维护的难度。考虑是否可以通过接口、类或泛型来简化设计。
七、结论
联合类型是TypeScript类型系统中的一个重要组成部分,它赋予了开发者在类型层面更大的灵活性和表达力。通过合理应用联合类型,不仅可以处理复杂的逻辑场景,还能在保证类型安全的前提下,提高代码的复用性和可维护性。掌握联合类型及其最佳实践,对于提升你的TypeScript编程能力至关重要。

相关文章:

【TS】TypeScript 联合类型详解:解锁更灵活的类型系统
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 TypeScript 联合类型详解:解锁更灵活的类型系统一、联合类型的定义二…...

kali改回官方源后更新失败
官方源: deb http://http.kali.org/kali kali-rolling main non-free contrib deb-src http://http.kali.org/kali kali-rolling main non-free contrib在文件 /etc/cat/sources.list中将官方源修改为: deb http://http.kali.org/kali kali-rolling ma…...
Mysql 左关联(LEFT JOIN)
在左关联(LEFT JOIN)操作中,关于大表和小表的连接顺序,通常建议将小表放在前面,大表放在后面。这种安排方式有助于提高查询效率,原因如下: 扫描效率:在SQL查询中,尤其是…...
[笔记]小米CyberDog机器狗仿真调试记录
从官方github的所有源码库来看,所有的source命令只有两条,执行它以配置环境变量: source /opt/ros/galactic/setup.bash source /home/cyberdog_ws/install/setup.bash 如果运行脚本之后gazebo正常启动及机器狗模型在悬空状态,问…...

第十四届蓝桥杯省赛C++B组G题【子串简写】题解(AC)
题目大意 给定字符串 s s s,字符 a , b a, b a,b,问字符串 s s s 中有多少个 a a a 开头 b b b 结尾的子串。 解题思路 20pts 使用二重循环枚举左端点和右端点,判断是否为 a a a 开头 b b b 结尾的字符串,是则答案加一…...
实现Java Web应用的高性能负载均衡方案
实现Java Web应用的高性能负载均衡方案 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在高并发的网络环境中,负载均衡是确保Web应用程序高性能和可靠性的关键策略之一。本文将探讨如何…...
医学预测模型web APP的制作建议
医学预测模型web APP的制作建议 医学预测模型类web APP定义为承载预测模型而便利预测模型临床应用的可视化客户端。 医学预测模型类web APP的功能是衔接预测模型和临床实践,让用户正确地,方便地使用预测模型并恰当地理解预测模型的结果,在此…...
gitlab每日备份以及restore
gitlab服务有非常简洁的每日备份命令, 从production的gitlab的每日备份中restore到backup环境也非常方便。 一、Production gitlab每日备份 1. Production gitlab环境上编写脚本 cat /root/gitlab_bak.shgitlab-rake gitlab:backup:create > /var/opt/gitl…...

2024-07-05 base SAS programming学习笔记9(variables)
1.在数据集增加累加变量值(SUM) 求和语句(SUM STATEMENT):variableexpression variable是累积求和的变量名,为数值型,默认初始值为0;该variable值则会保留到一个观测 当expression有缺失值,在求…...

kafka--发布-订阅消息系统
1. Kafka概述 1. kafka是什么 kafka是分布式的、高并发的、基于发布/订阅模式的消息队列软件系统。 kafka中的重要组件 Producer:消息生产者,发布消息到Kafka集群的终端或服务Consume:消费者,从Kafka集群中消费消息的终端或服…...
2024最新软件测试面试题。内附答案+文档
🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1、你以前工作时的测试流程是什么? 参考答案:(灵活回答&…...

新加坡很火的slots游戏代投Facebook广告新流量趋势
新加坡很火的slots游戏代投Facebook广告新流量趋势 在新加坡这片充满活力的土地上,Slots游戏以其独特的魅力和吸引力,迅速成为了许多玩家的心头好。而Facebook,作为全球最大的社交媒体平台之一,为Slots游戏的推广提供了得天独厚的…...
C++ 实现字符串逆序
C 实现字符串逆序 思路: 输入一个字符串。使用双指针法,交换字符串的首尾字符,逐步向中间移动。输出逆序后的字符串。 #include <iostream> #include <string>using namespace std;void reverseString(string &str) {int …...

【项目实践】贪吃蛇
一、游戏效果展示二、博客目标三、使用到的知识四、Win32 API 介绍 4.1 WIn32 API4.2 控制台程序4.3 控制屏幕上的坐标COORD4.4 GetStdHandle4.5 GetConsoleCursorInfo 4.5.1 CONSOLE_CURSOR_INFO 4.6 SetConsoleCursorInfo4.7 SetConsoleCursorPosition4.8 GetAsyncKeyState 五…...

将exe文件添加到注册表中,实现开机时自动运行
目录 一、前言 二、代码 三、使用步骤 1.编译生成exe文件、 2.以管理员身份运行代码 3.打开注册表,验证结果 一、前言 在Windows操作系统中,将exe文件的路径添加到注册表下,主要用于实现程序的开机自动运行功能。 注册表路径为…...
SQL使用注意事项
作为开发人员日常最为熟悉的工具sql。但是在实际使用中,有一些坑需要尽量避免,本文是对一些常用注意事项的总结 查询需要的。不要全部都查询。禁止使用存储过程,禁止使用外键。使用sql进行计算,要小心。(数据量大的情况…...
uniapp小程序IOS端,uni.createInnerAudioContext()无声音
可能的问题 路径中有中文字符需要使用uni.getBackgroundAudioManager()播放其他问题 解决办法 首先我的路径中没有中文字符,如果有的,可能需要转义一下或者干脆不使用中文字符,第二个也是从其他博客中看到的,我这边分享一下我的…...
第二节-K8s词汇表
关键字词汇表 https://kubernetes.io/zh-cn/docs/reference/glossary/?fundamentaltrue API Group (API 组)Kubernetes API 中的一组相关路径。 API 服务器亦称作:kube-apiserver API 服务器是 Kubernetes 控制平面的组件, 该组件负责公开了 Kubernetes API&…...

命令行运行git reflog(reference log)报错的解决办法
文章目录 1. 检查 Git 是否已安装2. 检查 PATH 环境变量3. 重新安装 Git 在Git中, reflog的英文全称是 “ reference log”。意思是 引用日志(参考日志)。它记录了本地仓库中HEAD和分支引用所指向的提交的变更历史。这包括了你所有的提交&…...
python3 imwrite 中文路径不成功解决方法
filename 中文路径 #cv2.imwrite(filename, frame) cv2.imencode(.jpg, frame)[1].tofile(filename)...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...