TS:如何判断联合类型变量的具体类型?

news2024/11/24 19:39:57

一 表示一个值可以是几种类型之一:联合类型

在TS中我们常会遇到这样一个问题。
一个变量,即可能是这种类型,也可能是那种类型,然后根据传入的类型的不同进行不同的操作。

比如下面这种情况:

if (pet.name === 'fish') {
    pet.swim();
}
else {
    pet.fly();
}

这里的pet可能具有两种类型:

interface Fist = {
	name: string;
	swim: (): void
}
interface Brid = {
	name: string;
	fly: (): void
}

表示一个值可以是几种类型之一。 我们用竖线( |)分隔每个类型,所以 number | string | boolean表示一个值可以是 number, string,或 boolean。
在这里,让pet可能具有两种类型,我们如下书写:

pet: Fish | Bird

但是我们发现,这时候我们不能直接使用pet.swim了pet.fly属性了。
使用pet.swim时,编译器提示类型Brid中不包含此属性。
而使用pet.fly时,编译器提示类型Fist中不包含此属性。
当一个变量为联合类型时,它无法直接访问联合类型中的非公共属性。因为它的类型不确定。
如果ts可以在运行时确定pet的具体属于哪个类型,就可以解决这个问题了。
这就出现下一个问题:如何在ts中,判断联合类型变量的具体类型?

二 如何判断联合类型变量的具体类型:类型保护

2.1 自定义类型保护

可以自己写一个自定义函数,用来判断变量的类型,这个函数返回一个布尔值。
返回值类型中使用 参数 is 类型 做定义。
当返回值为true时,任务参数 is 类型成立,否则不成立。

function isFish(pet: Fish | Bird): pet is Fish {
    return (<Fish>pet).swim !== undefined;
}

上面代码中记录了一个自定义函数isFish,返回值类型为 pet is Fish ,也就是说当返回值为true时,ts认为pet是Fish类型,否则是Bird类型
自定义函数的使用方式如下:

if (isFish(pet)) {
    pet.swim();
}
else {
    pet.fly();
}

2.2 type

基础类型还可以使用type来进行类型判断。
当type判断变量为"number", “string”, "boolean"或 "symbol"类型时,接下来的代码中该变量将被视为相关类型。
注意如果type判断变量为除四种外的其他类型,ts将无法识别,也就是该变量仍然被视为原有类型不变

const a: number | string = 'abc'
const b = a.length // 报错
if(type a === string) {
	const b = a.length // ok
}

2.3 instanceof类型保护

用法和js相同,用来判断构造函数。

2.4 剔除null与undefined

变量在未赋值时可能为null或undefined,这很常见。
但是在使用时就会报错,undefined上不包含该属性。
也就是变量类型为包含null/undefined的联合类型。
当一个变量的联合类型中含有null,可以直接通过判断去掉。

function f(sn: string | null): string {
    if (sn == null) {
        return "default";
    }
    else {
        return sn;
    }
}

为一个变量剔除null和undefined选项,也可以通过!进行快捷断言。

name!.charAt(0)

大家懂了吗!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/539477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三种灰狼优化算法(Grey Wolf Optimization)及仿真实验——附代码Matalb

目录 摘要&#xff1a; 灰狼算法原理&#xff1a; 灰狼算法流程&#xff1a; 改进的灰狼算法&#xff1a; 多目标的灰狼算法&#xff1a; 三种灰狼算法运行效果&#xff1a; &#xff08;1&#xff09;GWO &#xff08;2&#xff09;I-GWO &#xff08;3&#xff09;M…

Windows Server 2016 中文版、英文版下载 (updated May 2023)

Windows Server 2016 中文版、英文版下载 (updated May 2023) Windows Server 2016 Version 1607&#xff0c;2023 年 5 月更新 请访问原文链接&#xff1a;https://sysin.org/blog/windows-server-2016/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者…

4.7 树的实现(上)

树 树&#xff08;Tree&#xff09;是n&#xff08;n≥0&#xff09;个节点的有限集合T&#xff0c;它满足两个条件 &#xff1a; 有且仅有一个特定的称为根&#xff08;Root&#xff09;的节点&#xff1b; 其余的节点可以分为m&#xff08;m≥0&#xff09;个互不相交的有…

电子企业WMS仓储管理系统解决方案

随着科技的飞速发展&#xff0c;电子制造行业对仓储管理系统的需求也越来越高。电子企业需要一种能够规划、执行和优化仓库货物流通的IT解决方案&#xff0c;以实现自动化操作和提高效率。本文将探讨电子企业WMS仓储管理系统解决方案&#xff0c;从需求分析、系统设计、实施与运…

在Windows系统中安装Wireshark(图文)

1.打开Wireshark官网后&#xff0c;点Get Acquainted->Download后进入到下载界面&#xff0c;在Stable Release中选择下载Windows 64位的安装包&#xff0c;单击Windows Installer(64-bit) 下载。 2.双击下载的安装包&#xff0c;如下图&#xff0c;点击Next。 3.点Noted&am…

ELK的安装部署与使用

ELK的安装与使用 安装部署 部署环境&#xff1a;Elasticsearch-7.17.3 Logstash-7.17.3 Kibana-7.17.3 一、安装部署Elasticsearch 解压目录&#xff0c;进入conf目录下编辑elasticsearch.yml文件&#xff0c;输入以下内容并保存 network.host: 127.0.0.1 http.port: 9200…

基于相似加权自组装框架的低质量少样本MRI脑卒中病变分割

文章目录 Stroke Lesion Segmentation from Low-Quality and Few-Shot MRIs via Similarity-Weighted Self-ensembling Framework摘要本文方法Soft Distribution-aware Updating (SDU) 实验结果 Stroke Lesion Segmentation from Low-Quality and Few-Shot MRIs via Similarity…

蓝桥杯模块学习5——按键

第一章 硬件部分 1.1 电路的组成部分 1.1.1 按键电路 原理图&#xff1a; 功能&#xff1a; &#xff08;1&#xff09; J5&#xff1a;当1和2相接&#xff0c;电路就变成一个4*4的矩阵键盘电路&#xff1b;当2和3相接时&#xff0c;电路变成了一个S4-S7的独立按键&#xf…

平板触控笔要原装的吗?苹果平替笔性价比高的推荐

与苹果的电容笔不同&#xff0c;市场上的电容笔只会给人一种倾斜的压感&#xff0c;并不会像苹果的电容笔那样&#xff0c;可以给人一种重力的压感。不过&#xff0c;如果你不一定要画画&#xff0c;那你就不用花很多钱去买一支苹果的原装电容笔了&#xff0c;只需一支平替电容…

ss命令使用详解

ss是Socket Statistics的缩写。顾名思义&#xff0c;ss命令可以用来获取socket统计信息&#xff0c;它可以显示和netstat类似的内容。ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息&#xff0c;而且比netstat更快速更高效。 当服务器的socket连接数量变得非常大…

从小白到专家:如何在营销中利用 AI 的力量

欢迎来到营销的未来&#xff0c;时至今日人工智能和人类专业知识以前所未有的方式结合在一起。 认识ChatGPT&#xff0c;这是改变游戏规则的革命性工具。 借助ChatGPT&#xff0c;你最终将能够利用AI的力量做出明智的、数据驱动的决策来满足你的受众需求。 但ChatGPT不仅仅是…

[高光谱]高光谱数据的获取与展示

一、环境准备 需要安装spectral包&#xff0c;这个包专门用于高光谱数据展示。 pip install spectral 二、数据加载 要预先准备原始高光谱的.mat数据和分类数据gt.mat(ground-turth)&#xff1b;然后使用scipy.io中的loadmat(.)将其读入程序。 from scipy.io import loadmat…

JCJC句子改写在线工具上线-202305

JCJC句子改写在线工具上线-202305 字根科技发布了新版JCJC在线句子改写功能。 使用网址&#xff1a; JCJC在线句子改写 新版的在线中文句子改写一共分为三种模式&#xff1a; 严谨模式普通模式休闲模式 上述三种改写模式适用于不同的改写需求&#xff0c;界面展示如下&…

springboot读取和写入csv文件数据

前言 csv格式的表格&#xff0c;和xls以及xlsx格式的表格有一些不同&#xff0c;不能够直接用处理xls的方式处理csv&#xff1b; 以下我将介绍如何读取并写入csv数据 准备工作 要处理csv格式的表格数据&#xff0c;我们首先需要引入pom.xml的依赖 <dependency><art…

Linux如何实现动态IP

Linux系统可以通过DHCP&#xff08;动态主机配置协议&#xff09;来实现动态IP。DHCP是一种自动分配IP地址的协议&#xff0c;它可以自动为网络中的设备分配IP地址、子网掩码、网关等网络参数&#xff0c;从而实现动态IP。 在Linux系统中&#xff0c;可以使用DHCP客户端工具来…

分享个常用的跨境电商数据分析平台

在跨境电商人眼中&#xff0c;适合用在跨境电商数据分析上的大数据分析平台该是怎样的&#xff1f;是效率高、财务指标计算快、业务能随时自助分析&#xff0c;最好是能将平台自身的分析经验分享给跨境电商企业&#xff0c;为企业提供更专业的服务。这样的大数据分析平台虽然少…

【Prometheus】实战Prometheus部署

目录 架构安装部署Exporters 架构 Prometheus的基本原理是通过HTTP周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的HTTP接口并符合Prometheus定义的数据格式&#xff0c;就可以介入Prometheus监控 Prometheus Server负载定时在目标上抓取metrics(指标)数据&…

chatgpt-最常报错Access denied

一、问题 Access denied 的原因基本都是由于 IP 地址&#xff0c;例如我们用国内网络直接访问 ChatGPT 官网就会报错 Access denied&#xff08;访问被拒绝&#xff09;&#xff0c;Error reference number 1020&#xff08;错误参考编号&#xff1a;1020&#xff09; 二、原因…

Nginx(一)---Nginx下载及安装

一.初识Nginx Nginx 是一个功能强大的 Web 服务器和反向代理服务器。其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力确实在同类型的网页服务器中表现较好&#xff0c;中国大陆使用nginx网站用户有&#xff1a;百度、京东、新浪、网易、腾讯、淘宝…

在Windows中如何使用工具恢复已删除的文件?

​当你的电脑遇到任何类型的数据丢失问题时&#xff0c;傲梅恢复之星都会帮助你。你可以在Windows 11/10/8/7中快速轻松的从HDD/SSD恢复丢失或删除的数据。 傲梅恢复之星功能 易于使用&#xff1a;你可以通过3个简单易行的步骤轻松恢复丢失的数据。 适合多种数据丢失情况&a…