typescript第五天—联合类型和类型保护、Enum枚举类型

2023-11-02

联合类型和类型保护

联合类型展示

所谓联合类型,可以认为一个变量可能有两种或两种以上的类型。用代码举个例子,声明两个接口Waiter(服务员)接口和Teacher(技师)接口,然后在写一个judgeWho(判断是谁)的方法,里边传入一个animal(任意值),这时候可以能是Waiter,也可能是Teacher。所以我们使用了联合类型,关键符号是|(竖线)。

interface Waiter {
   
  anjiao: boolean;
  say: () => {
   };
}

interface Teacher {
   
  anjiao: boolean;
  skill: () => {
   };
}

function judgeWho(animal: Waiter | Teacher) {
   }

通过这个简单的例子,你应该知道什么是联合类型了。

function judgeWho(animal: Waiter | Teacher) {
   
  animal.say();
}

但这时候问题来了,如果我直接写一个这样的方法,就会报错,因为judgeWho不能准确的判断联合类型具体的实例是什么。

这时候就需要再引出一个概念叫做类型保护,类型保护有很多种方法,这节讲几个最常使用的。

类型保护-类型断言

类型断言就是通过断言的方式确定传递过来的准确值,比如上面的程序,如果会anjiao(按脚),说明他就是技师,这时候就可以通过断言animal as Teacher,然后直接调用skill方法,程序就不再报错了。同样如果不会按脚,说明就是不同的服务员,这时候调用say()方法,就不会报错了。这就是通过断言的方式进行类型保护。也是最常见的一种类型保护形式。具体看代码:

interface Waiter {
   
  anjiao: boolean;
  say: () => {
   };
}

interface Teacher {
   
  anjiao: boolean;
  skill: () => {
   };
}

function judgeWho(animal: Waiter | Teacher) {
   
  if (animal.anjiao) {
   
    (animal as Teacher).skill();
  }else{
   
    (animal as Waiter).say();
  }
}

类型保护-in 语法

我们还经常使用in语法来作类型保护,比如用if来判断animal里有没有skill()方法。

这里你可以赋值上面的judgeWho()方法,然后改一下名字,我这里改成了judgeWhoTwo()方法,具体程序如下:

function judgeWhoTwo(animal: Waiter | Teacher) {
   
  if ("skill" in animal) {
   
    animal.skill();
  } else {
   
    animal.say();
  }
}

这里的else部分能够自动判断,得益于TypeScript的自动判断。

类型保护-typeof 语法

先来写一个新的add方法,方法接收两个参数,这两个参数可以是数字number也可以是字符串string,如果我们不做任何的类型保护,只是相加,这时候就会报错。代码如下:

function add(first: string | number, second: string | number) {
   
  return first + second;
}

解决这个问题,就可以直接使用typeof来进行解决。

function add(first: string | number, second: string | number) {
   
  if (typeof first === "string" || typeof second === "string") {
   
    return 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

typescript第五天—联合类型和类型保护、Enum枚举类型 的相关文章

随机推荐

  • 2.查询分离:表数据量大读写缓慢如何优化?

    查询分离 表数据量大读写缓慢如何优化 01 讲中我们提到过 冷热分离解决方案的性价比高 但它并不是一个最优的方案 仍然存在诸多不足 比如 查询冷数据慢 业务无法再修改冷数据 冷数据多到一定程度系统依旧扛不住 我们如果想把这些问题一一解决掉
  • 如何设置电脑永不熄屏

    1 win q调出搜索框 输入系统 点击系统 2 电源和睡眠 两个选项改为从不 如果是虚拟机 设置永不熄屏的方法 设置
  • 猿创征文

    文章目录 1 PolarDB X是什么 2 PolarDB X架构 3 PolarDB X架构优势 4 PolarDB X核心特性 5 PolarDB X部署 5 1 通过PXD部署集群 5 2 通过 K8S 部署 5 3 通过编译安装 1
  • 【Mybatis-puls 】返回map下划线自动转成驼峰

    文章目录 问题描述 1 yml配置解决方案 错误分析 解决方案 转换器代码 ConfigurationPropertiesBinding的作用 2 通过Java配置bean解决 觉得第一种麻烦的直接用第二种 问题描述 VO实体类自动转换驼峰
  • 使用plsql工具查看oracle中的blob字段的可视化值

    SELECT utl raw cast to varchar2 dbms lob substr t detailsql from Voucher t
  • 每天一个设计模式——装饰模式(C++实现)

    设计模式的代码十分难写的 要充分的体现可复用性 网上有着大量关于设计模式的代码 其中很多的代码违背了很多设计原则 比如依赖倒置原则 开放封闭原则 需要我们明辨是非 设计模式的原则大于使用哪个设计模式 类的组合关系也大于类的继承 通过不断的写
  • ECCV 2022

    作者 机器之心编辑部 来源 机器之心 如何将现有的图像 文本多模态大模型 例如 OpenAI CLIP 用于视频内容理解 是一个非常实用且具有前景的研究课题 它不仅可以充分挖掘图像大模型的潜力 还可以为视频大模型的设计和研究铺平道路 在视频
  • 年轻人还记得KCP吗?什么是KCP,怎么使用呢!!!

    一 什么是KCP KCP是一种网络传输协议 A Fast and Reliable ARQ Protocol 可以视它为TCP的代替品 但是它运行于用户空间 它不管底层的发送与接收 只是个纯算法实现可靠传输 它的特点是牺牲带宽来降低延迟 因
  • C51单片机学习笔记(二)——花样流水灯的实现

    C51单片机学习笔记 二 花样流水灯的实现 文章目录 C51单片机学习笔记 二 花样流水灯的实现 1 单片机引脚 晶振 复位的作用 2 流水灯原理图 3 单片机的周期 4 延时函数的编写 5 使用 位操作 控制流水灯 6 使用字节控制 并行
  • lenovo联想笔记本ThinkBook 14 Gen5+ IRH(21HW)原装Win11系统镜像原厂OEM恢复出厂状态

    LENOVO联想笔记本电脑 ThinkBook 14 Gen5 IRH 21HW 原厂Windows11原装OEM系统 恢复出厂时状态系统 系统自带所有驱动 出厂主题壁纸LOGO Office办公软件 联想电脑管家等预装程序 所需要工具 1
  • java客户端作为kafka消费者测试

    README 本文主要对 java客户端作为kafka 消费者进行测试 生产者由 kafka客户端扮演 1 普通消费者 设置消费者组 重置消费者的offset 即每次都从最头开始消费 默认仅保持7天内数据 类似于 命令行 from begi
  • 【node.js】Node.js下载安装(在vscode中使用)01

    博 主 初映CY的前说 个人信条 想要变成得到 中间还有做到 本文核心 Node js的下载安装操作 目录 一 node介绍 二 node js下载安装 一 node介绍 Node js是一个Javascript运行环境 runtime 实
  • Java句柄与指针

    java中的句柄分为两种 对象句柄 jvm中对象访问句柄 一 对象句柄 句柄 一个唯一的整数 作为对象的身份id 区分不同的对象 和同类中的不同实例 程序可以通过句柄访问对象的部分信息 句柄不代表对象的内存地址 在Java中的任何东西都可以
  • mysql 用户量,MySQL ── 用户数全球排名第一的免费开源关系型数据库

    MySQL 是一种关联数据库 关联数据库会将数据保存在不同表中 而不是将所有数据放在一个大仓库内 这样就增加了速度并提高了灵活性 MySQL 所使用的 SQL 语言是用于访问数据库的最常用标准化语言 MySQL 软件采用了双 授权政策 社区
  • 打开qt文件报“could not decode ... with “UTF-8“ -encoding” Editting not possible

    从别人那拷来的qt程序 报错如下 深入解决不能在文件编辑中切换中文输入的问题 仔细按照以下三步操作 可以解决 1 点击 Select Encoding 按编码重新载入GB2312格式或者GBK 虽然能编辑代码但仍不能切换中英文输入 此时 应
  • 使用ftp实现windows和ios的公网文件夹共享

    请注意 本文主要研究的是如何实现在公网环境下 即电脑和ipad或iPhone设备不在同一网络下 实现文件夹共享 如果你想实现的仅仅是局域网间的文件夹共享 可以参考博客使用SMB和ipad自带的文件app实现 操作简单实现快ipad和wind
  • 设计模式:解释器模式

    定义 给定一种语言 定义他的文法的一种表示 并定义一个解释器 该解释器使用该表示来解释语言中句子 类型 行为类模式 类图 解释器模式是一个比较少用的模式 本人之前也没有用过这个模式 下面我们就来一起看一下解释器模式 解释器模式的结构 抽象解
  • reduce端join算法实现

    数据 订单数据表order date pid amount 20150710 P0001 2 20150710 P0002 3 商品信息表product pid pname category id price P0001 小米5 1000
  • linux系统下的动态壁纸,Ubuntu 10.04下实现动态桌面壁纸

    不知大家在使用Ubuntu时有没有注意到 Ubuntu下是可以实现多张壁纸动态切换的 好像Win7下也有类似的功能 曾经使用 win7一段时间 我也是最近才注意到这点 下面是在Ubuntu 10 04下实验的 之前版本的应该也可以 实现原理
  • typescript第五天—联合类型和类型保护、Enum枚举类型

    联合类型和类型保护 联合类型展示 所谓联合类型 可以认为一个变量可能有两种或两种以上的类型 用代码举个例子 声明两个接口Waiter 服务员 接口和Teacher 技师 接口 然后在写一个judgeWho 判断是谁 的方法 里边传入一个an