【TypeScript】TS类型守卫(六)


【TypeScript】TS类型守卫(六)


在这里插入图片描述

    • 【TypeScript】TS类型守卫(六)
        • 一、什么是类型守卫
        • 二、in操作符
        • 三、typeof操作符
        • 四、instanceof操作符
        • 五、自定义类型谓词函数

一、什么是类型守卫

TypeScript类型守卫(Type Guards) 是一种用于在代码中确定变量类型的技术,它允许我们在运行时检查变量的类型,并根据需要执行不同的逻辑。TypeScript 类型守卫可以使用不同的语法实现,如 typeof操作符、instanceof操作符、in操作符和自定义类型谓词函数。它们可用于增强类型安全性,并提高代码的可读性和可维护性。

在上篇介绍了断言(不清楚的小伙伴点击该链接查看,【TypeScript】类型断言-类型的声明和转换(五))在使用断言时我们已经确定了变量的类型,确定该类型时一定存在(否则则会欺骗编译,运行时报错),那么为什么还要类型守卫呢?因为类型断言还是需要借助类型守卫的,类型守卫主要是用来判断未知类型是不是所需要的类型。

主要的四种类型守卫:

  • typeof操作符
  • instanceof操作符
  • in操作符
  • 自定义类型谓词函数

二、in操作符

  • 定义属性场景下内容的确认

    先写两个接口Teacher、Student,然后将这两个接口进行联合声明,使用 in 来判断属性是否在传递的参数中,然后分别作输出。
    缺点:用in关键字缩小数据类型必须有一个独特的属性作为判别标准,否则不能用in关键字

interface Teacher{name:string;courses:string;
}
interface Student{name:string;study:string;
}
type Class = Teacher | Student;
function getInfo(val:Class){//此时val类型缩小为Teacher类型if('courses' in val){console.log(val.courses)}//此时val类型缩小为Student类型if('study' in val){console.log(val.study)}
}
getInfo({ name: 'student', study: "Philosophy" });
//打印结果为Philosophy,因为传参中含有study属性,所以走了第二个判断

三、typeof操作符

类型分类场景下的身份确认
为什么用 typeof 做类型守卫呢?因为 typeof 能判断JS基本数据类型。

typeof只能识别以下类型:

  • Boolean
  • String
  • Undefined
  • Function
  • Number
  • Bigint
  • Symbol

语法:typeof a
其中a是变量(基本数据类型)

需要注意的是,对于 null 类型,使用 typeof 判断时,得到的结果是 object
typeof 识别其他的类型比如 数组,正则等都是object类型

let a =[1]
typeof a;//Objectvar reg = RegExp("a","i");
typeof reg//reg

请添加图片描述
typeof 怎么起到守卫的作用呢,是通过 typeof 判断变量类型然后执行相应的逻辑,具体如下:

function class(name: string, score: string | number) {//识别到sore为number类型if (typeof score === "number") {return "teacher:" + name + ":" + score;}//识别到sore为string类型if (typeof score === "string") {return "student:" + name + ":" + score;}
}

上面案例的传参都是基本类型,当传一个对象时候,我们也可以用对象中的属性来进行判断,比如:


interface A{a:string;
}
interface B{a:number;
}
type Class = A | B;
function getInfo(val:Class){//判断val的属性a的类型为number类型if(typeof val.a === "number"){console.log('B:'+ val.a)}//判断val的属性a的类型为string类型if(typeof val.a === "string"){console.log('A' + val.a)}
}

编译后的结果如下:
请添加图片描述

四、instanceof操作符

为什么用instanceof呢?因为 typeof 有局限性,引用类型比如数组、正则等无法精确识别是哪一个种型,instanceof 则能够识别变量(比如实例对象)是否属于这个类。instanceof 不能检测原始值类型的值,但是原始值对应的对象格式实例则可以检测

具体 instanceof 是怎么做类型守卫的呢?

语法:a instanceof b

其中 a 是参数,b 一般都是接口类型。

abstract class Teacher{name:string;courses:string;}
abstract class Student{name:string;study:string;}type Class = Teacher | Student;function getInfo(val:Class){//判断val的类型是否是定义的接口Teacher类型if(val instanceof Teacher){console.log('teacher:'+ val.courses)}//判断val的类型是否是定义的接口Student类型if(val instanceof Student){console.log('student' + val.study)}}

五、自定义类型谓词函数

TypeScript 中有一个关键字 is 可以判断变量是否属于某种类型。

语法:a is b,意思是 a是b类型a 可以是函数参数,也可以是this关键字,this关键字一般用在类中判断,b可以是接口类型,b也可以是number、string等其他合法的 TypeScript 类型。

这种写法称作类型谓词,使用类型谓词的函数称为 类型谓词函数,该函数的返回值必须的boolean类型。

使用:先定义一个变量,该变量表示是否是某种类型,比如以下定义了 isTeacher,代表了参数 cls 是 Teacher 类型,然后用这个变量来判断。

  • 函数参数形式

    函数中的参数类型为多个类型,通过 is 关键字自定义类型,将函数参数精确到某种类型,然后再执行相应的逻辑。

    interface Teacher{name:string;courses:string;
    }
    interface Student{name:string;study:string;
    }
    const isTeacher = function (cls: Teacher | Student): cls is Teacher {return 'courses' in cls;
    }
    const getName = (cls: Teacher | Student) => {if(isTeacher(cls)) {return cls.courses;}return null;
    }

    编译后如下:
    请添加图片描述

  • this形式

下面代码中的 User 是抽象类,不能被实例化,Staff 和 Student 都继承自 User。实例方法 isStaff 用于将类型收窄为 Staff,实例方法 isStudent 用于将类型收窄为 Student。

abstract class User {name: string;constructor(name: string) {this.name = name;}isStudent(): this is Student {return this instanceof Student;}isStaff(): this is Staff {return this instanceof Staff; }
}class Student extends User{study: string;constructor(name: string, study: string) {super(name)this.study = study}
}class Staff extends User {workingYears: number;constructor(name: string, workingYears: number) {super(name)this.workingYears = workingYears}
}function judgeClassType(obj: User) {if (obj.isStaff()) {// obj的类型被缩小为 Staff} else if (obj.isStudent()){// obj 的类型被缩小为 Student}
}

以上就是【TypeScript】TS类型守卫的介绍。




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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python实现SSA智能麻雀搜索算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种新型的群智能优化算法,在2020年提出&a…

Spring Cloud构建微服务断路器介绍

什么是断路器 断路器模式源于Martin Fowler的Circuit Breaker一文。“断路器”本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时,“断路器”能够及时的切断故障电路,防止发生过载、发热、甚至起火等严重后果…

SpringBoot 热部署

文章目录 前言一、spring-boot-devtools添加热部署框架支持settings 开启项目自动编译开启运行中热部署使用Debug启动 二、IDEA 自带 HowSwap 功能设置 Spring Boot 启动类等待项目启动完成点击热加载按钮存在的问题 三、JRebel 插件【推荐】安装插件使用插件 前言 在日常开发…

plt取消坐标轴刻度、自定义取消绘图边框(或坐标轴)、白边处理、自定义颜色图谱、设置坐标轴刻度朝向

目录 1、取消坐标轴刻度 2、自定义取消绘图边框(或坐标轴) 3、去掉图片周边白边 4、自定义颜色图谱 5、设置坐标轴刻度朝向 import matplotlib.pyplot as plt 1、取消坐标轴刻度 ax plt.subplot() ax.set_xticks([]) ax.set_yticks([]) 2、自定…

Nuxt.js快速上手

Nuxt.js快速上手 Nuxt.js快速上手1、为什么用nuxtvue-cli本身问题预渲染服务端渲染(通过SSR)项目解决seo的方案选择 2、Nuxt安装和使用Nuxt安装和使用nuxt安装和目录结构nuxt生命周期nuxt路由nuxt导航守卫nuxt Vuex状态树 3、Nuxt配置项nuxt配置之headnuxt配置之cssnuxt配置之p…

在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——聚合与搜索(三)

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

PLUS操作流程、应用与实践,多源不同分辨率数据的处理、ArcGIS的应用、PLUS模型的应用、InVEST模型的应用

PLUS模型是由中国地质大学(武汉)地理与信息工程学院高性能空间计算智能实验室开发,是一个基于栅格数据的可用于斑块尺度土地利用/土地覆盖(LULC)变化模拟的元胞自动机(CA)模型。PLUS模型集成了基于土地扩张分析的规则挖掘方法和基于多类型随机…

Python爬虫IP代理池的建立和使用

写在前面 建立Python爬虫IP代理池可以提高爬虫的稳定性和效率,可以有效避免IP被封锁或限制访问等问题。 下面是建立Python爬虫IP代理池的详细步骤和代码实现: 1. 获取代理IP 我们可以从一些代理IP网站上获取免费或付费的代理IP,或者自己租…

阿里云云主机_ECS云服务器_轻量_GPU_虚拟主机详解

阿里云云主机分为云虚拟主机、云服务器ECS、轻量应用服务器、GPU云服务器、弹性裸金属服务器、专有宿主机、FPGA云服务器、高性能计算E-HPC、无影云电脑等,阿里云百科来详细说下阿里云云主机详解: 目录 阿里云云主机 云服务器ECS 轻量应用服务器 云…

Vue+ElementUI实现选择指定行导出Excel

这里记录一下,今天写项目时 的一个需求,就是通过复选框选中指定行然后导出表格中选中行的Excel表格 然后这里介绍一个工具箱(模板):vue-element-admin 将它拉取后,运行就可以看到如下界面: 这里面的很多功能都已经实现…

淘宝API接口的实时数据和缓存数据区别

电商API接口实时数据是指通过API接口获取到的与电商相关的实时数据。这些数据可以包括商品库存、订单状态、销售额、用户活跃度等信息。 通过电商API接口,可以实时获取到电商平台上的各种数据,这些数据可以帮助企业或开发者做出及时的决策和分析。例如&…

抓取预测二手车价格的机器学习模型

一、说明 你好,希望那里一切都好!今天在本文中,我们有三个不同的部分。1)我想与您分享一个主题故事,以便您了解该主题。2)我们将深入探讨该过程。您将学习一些网页抓取方法。3)然后当然是EDA过程…