Typescript - 类型守卫(typeof / in / instanceof / 自定义类型保护的类型谓词)通俗易懂详细教程
前言
类型守卫用于获取变量类型信息,通常使用在条件块语句中。类型守卫是返回布尔值的常规函数,接受一个类型并告诉 TypeScript 是否可以缩小到更具体的类型。类型守卫具有唯一的属性,可以确保测试的值返回的是布尔值类型。
TypeScript 使用了一些内置的 JavaScript 操作符(见下方),这些操作符用于确定一个对象是否包含属性。类型守卫可以让你 指导 TypeScript 编译器在特定的上下文中推断出变量的特定类型,确保参数的类型与你指定的一致。
类型守卫非常类似于特征检测,允许您检测值原型和属性。
类型保护是可执行运行时检查的一种表达式,用于确保该类型在一定的范围内。 换句话说,类型保护可以保证一个字符串是一个字符串,尽管它的值也可以是一个数值。类型保护与特性检测并不是完全不同,其主要思想是尝试检测属性、方法或原型,以确定如何处理值。
Typescript 类型守卫主要在类型窄化时使用,其实现类型守卫主要有以下 4 种方式:
- typeof(类型判断)
- in(属性或方法判断)
- instanceof(实例判断)
- 自定义类型保护的类型谓词
typeof
该关键字或许您可能在 JavaScript 中见过,甚至使用过。
typeof 只能检查基本数据类型(不能检查复杂数据类型),比如下面这些:
string | number | bigint | boolean | symbol | undefined | object | function
使用方法很简单,如下代码所示:
// 姓名(字符串类型)
let uname: string = "王佳斌"// 判断其类型
console.log(typeof uname) //string
in
它用于检查对象是否具有特定的属性,并使用该属性区分不同的类型。它通常返回一个布尔值,表示该属性是否存在于该对象中。
该操作符用于遍历目标类型的公开属性名,如下代码所示:
// 示例一
const obj = { name: '王佳斌', age: 15 }
console.log('name属性是否存在于obj对象?', 'name' in obj)//"name属性是否存在于obj对象?", true// 示例二
type Property = 'name' | 'age' | 'phoneNum';
type PropertyObject = { [key in Property]: string; }
instanceof
它是一个内置类型守卫,可用于检查一个值是否是给定构造函数或类的实例。
有了这个类型守卫,我们可以测试一个对象或值是否派生自一个类,这对于确定实例类型的类型很有用。
instanceof 关键字的基本语法如下:
objectVariable instanceof ClassName;
一个 instanceof 的例子,如下代码所示:
interface Accessory {brand: string;}// implements// 实现,一个新的类,从父类或者接口实现所有的属性和方法,同时可以重写属性和方法,包含一些新的功能// 一个类通过关键字implements声明自己使用一个或者多个接口。class Necklace implements Accessory{kind: string;brand: string;constructor(brand: string, kind: string) { this.brand = brand;this.kind = kind;}}class bracelet implements Accessory{brand: string;year: number;constructor(brand: string, year: number) { this.brand = brand;this.year = year;}}const getRandomAccessory = () =>{return Math.random() < 0.5 ?new bracelet('cartier', 2021) :new Necklace('choker', 'TASAKI');}let Accessory = getRandomAccessory();if (Accessory instanceof bracelet) {console.log(Accessory.year);}if (Accessory instanceof Necklace) {console.log(Accessory.brand); }
上面的 getRandomAccessory 函数返回一个 Necklace 或 bracelet 对象,因为它们都实现了 Accessory 接口。
Necklace 和 bracelet 的构造函数签名是不同的,用 instanceof 比较两个构造函数签名可以有效地确定类型。
自定义类型保护的类型谓词
这种自定义的方式更加灵活,如下代码所示:
// 验证是否是number类型
function isNumber(x: any): x is number {return typeof x === "number";
}// 验证是否是string类型
function isString(x: any): x is string {return typeof x === "string";
}
调用函数传入参数(any 任意类型),如果类型正确则返回 true,反之 false。
SEO
TypeScript类型守卫,ts 类型守卫是什么,ts类型守卫的方式教程,ts中的类型守卫是干啥的,typescript 类型守卫详细讲解教程,typescript类型守卫是什么?typescript类型守卫,TypeScript类型守卫的几种方式,ts的类型守卫入门教程,ts类型守卫简单的教程,Typescript - 类型守卫(typeof / in / instanceof / 自定义类型保护的类型谓词)通俗易懂详细教程。ts typeof 用法,ts in 用法,ts instanceof 关键字用法,ts 自定义类型保护的类型谓词。
相关文章:
Typescript - 类型守卫(typeof / in / instanceof / 自定义类型保护的类型谓词)通俗易懂详细教程
前言 类型守卫用于获取变量类型信息,通常使用在条件块语句中。类型守卫是返回布尔值的常规函数,接受一个类型并告诉 TypeScript 是否可以缩小到更具体的类型。类型守卫具有唯一的属性,可以确保测试的值返回的是布尔值类型。 TypeScript 使用了…...
6.8 左特征向量
特征值很复杂,除了普通的特征向量外,还有左特征向量和广义特征向量。先说说比较容易的左特征向量吧。它是这样定义的,AAA是一个矩阵,λ\lambdaλ是它的一个特征值,下面的向量yyy就是矩阵关于特征值的左特征向量left ei…...
10个自动化测试框架,测试工程师用起来
软件行业正迈向自主、快速、高效的未来。为了跟上这个高速前进的生态系统的步伐,必须加快应用程序的交付时间,但不能以牺牲质量为代价。快速实现质量是必要的,因此质量保证得到了很多关注。为了满足卓越的质量和更快的上市时间的需求…...
城市C友会【官方牵头更多的线下交流的机会,你有怎样的期待?】
文章目录🌟 课前小差🌟 长沙线下🌟 C友会你也可以是组织者🌟 线下交流提升价值🌟 官方与抖音合作?🌟 23年动起来🌟 写在最后🌟 课前小差 哈喽,大家好&#x…...
CSDN 编程竞赛二十七期题解
竞赛总览 CSDN 编程竞赛二十七期:比赛详情 (csdn.net) 四道题都不难,本来十分钟内就可以解决,但是这次竞赛bug比较多,体验不是很好。 竞赛题解 题目1、幸运数字 小艺定义一个幸运数字的标准包含三条:1、仅包含4或…...
RMI攻击中的ServerClient相互攻击反制
前言 前文中,我们分析了攻击Registry的两种方式,这里我们接着前面的内容,分析Server和Client的相互攻击方式。 Attacked Server Attacked By Client 首先我们搭建个示例,这里直接注册端和服务端放置在一起。 package pers.rm…...
值类型和引用类型
一、值类型和引用类型示例: 值类型:基本数据类型系列,如:int,float,bool,string,数组和结构体等。 引用类型:如:指针,slice切片,map&a…...
后端开发必懂nginx面试40问
什么是Nginx? Nginx是一个 轻量级/高性能的反向代理Web服务器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。他实现非常高效的反向代理、负载平衡,他可以处理2-3万并发连接数,官方监测能支持5万并发,现在中国使用ngin…...
Redis为什么这么快?
1.基于内存存储实现 在MySQL数据库中,所有的读写操作都要通过IO的方式从硬盘中获取。在Redis中,所有的操作都是基于内存实现的,从而减少IO操作提高数据库性能。 2.高效的数据结构 SAS简单动态字符串 字符串长度:SAS查询的时间复杂度O(1),c语言中时间复杂度O(n)空间分配来…...
几种实现主题切换的方式
几种实现主题切换的方式 1. 利用 prefers-color-scheme 特性 prefers-color-scheme是CSS 媒体特性【media】用于检测用户是否有将操作系统的主题色设置为亮色【light】或者暗色【dark】。 当前prefers-color-scheme新特性支持各大主流电脑(window和IOS系统&#…...
Jenkins使用(代码拉取->编译构建->部署上线)
Jenkins简介 Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更重要的业务逻辑实现上。同时Jenkins能实时监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用…...
IEEE期刊论文投稿前期准备
目录 1、简介 2、资料准备 TPAMI 投稿须知 Letex模板资料下载 下载参考文献Bib文件...
[AAAI 2022] TransFG: A Transformer Architecture for Fine-grained Recognition
Contents TransFG ArchitectureExperimentsReferencesTransFG Architecture Overlapping patch split:ViT 是把图片分成一系列不重叠的 patches,作者认为这可能会破坏 discriminative regions. 为了解决上述问题,作者提出使用 Overlapping patch split,划分的 patch 数 N …...
机器学习之决策树原理详解、公式推导(手推)、面试问题、简单实例(python实现,sklearn调包)
目录1. 决策树原理1.1. 特性1.2. 思路1.3. 概念决策树概念信息论2. 公式推导2.1. 构造决策树2.1.1. ID3理论示例缺点2.1.2. C4.5理论示例缺点2.1.3. CART示例对比分析2.2. 剪枝3. 实例3.1. 数据集3.2. ID33.3. C4.53.4. CART3.5. sklearn实现4. 几个注意点(面试问题)5. 运行&am…...
一文搞懂CAS实现原理——怀玉
点个关注,必回关 文章目录CAS原理剖析1、参数解密CAS底层指令CAS(Compare and swap)是一种用于在多线程环境下实现同步功能的机制CAS原理剖析 CAS 被认为是一种乐观锁,有乐观锁,相对应的是悲观锁。 在上述示例中&…...
typora每次复制文档都要附带图片文件夹?学会配置gitee图床
0. 引言 作为开发人员,我们习惯使用md格式来编写文档,特别是typora编辑器更是日常使用的软件。但作为轻量化的文档编辑器,我们在默认插入图片时,一般typora会将图片保存到本地或者引用一个本地图片的路径 当文档还在我们本地打开…...
Linux--gdb
gdb用于实现在linux下通过gdb进行调试。由于gcc、g生成的文件是release文件,而不是用于调试的debug文件,所以需要使用gcc -g命令,生成debug文件 调试器:核心工作,主要是为了定位问题 所有查看内容的指令,不…...
c++11 标准模板(STL)(std::multimap)(二)
定义于头文件 <map> template< class Key, class T, class Compare std::less<Key>, class Allocator std::allocator<std::pair<const Key, T> > > class multimap;(1)namespace pmr { template <class Key, class T…...
【数据结构】二叉排序树——平衡二叉树的调整
文章目录前置概念一、构造平衡二叉树的基本思想二、一个示例三、平衡二叉树的调整细节(1)LL型(顺时针 )举例(2)RR型(逆时针)(3)LR型(先逆时针再顺…...
03- pandas 数据库可视化 (数据库)
pandas库的亮点: 一个快速、高效的DataFrame对象,用于数据操作和综合索引;用于在内存数据结构和不同格式之间读写数据的工具:CSV和文本文件、Microsoft Excel、SQL数据库和快速HDF 5格式;智能数据对齐和丢失数据的综合处理&#…...
从Arduino官网的‘eagle-files’说起:给硬件新手的Autodesk Eagle PCB设计入门指南
从Eagle文件到PCB设计:开源硬件爱好者的实战入门指南 在开源硬件社区里,Arduino项目的"eagle-files"文件夹常常让新手感到困惑又好奇。这些文件背后隐藏着一个强大的工具链——Autodesk Eagle,它是欧美开源硬件生态中PCB设计的通用…...
ARM调试寄存器DBGCLAIMCLR详解与应用
1. ARM调试寄存器概述 在嵌入式系统开发中,调试寄存器是连接开发者和硬件的重要桥梁。作为ARM架构调试系统的核心组件,DBGCLAIMCLR这类专用寄存器提供了底层硬件级别的调试能力。不同于普通的存储器映射寄存器,调试寄存器通过系统寄存器空间进…...
金属表面缺陷智能检测新突破
篇名问题,背景方法结论金属表面缺陷自适应分割算法1.金属表面划痕 2.金属表面凹凸 3.金属表面污点 4.金属表面刮擦 5.金属表面裂纹2.1多方向灰度波动分析 2.2领域灰度差分割算法 2.3PCA法图像压缩本文算法与其他算法相比,具有通用性好、分割准确度高等优…...
Copaw-dev:基于CLI的开发者工作流自动化工具实践指南
1. 项目概述:一个为开发者量身定制的“副驾驶”如果你是一名开发者,尤其是经常在终端里敲命令、管理多个项目、需要快速切换环境的那类,那你一定对“效率工具”有着近乎偏执的追求。今天要聊的这个项目,hellogxp/copaw-dev&#x…...
dojo.md:从提示词工程到技能工程,打造稳定可靠的AI智能体
1. 项目概述:为什么你的AI助手在演示时很聪明,一上线就“翻车”? 你有没有过这样的经历?精心调教了一个AI助手,让它帮你写邮件、处理客服问题或者生成广告文案,在测试环境里它对答如流,表现堪称…...
终极AMD锐龙处理器调试指南:深度掌握硬件性能调优的完整解决方案
终极AMD锐龙处理器调试指南:深度掌握硬件性能调优的完整解决方案 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: …...
逆向工程实现GitHub Copilot HTTP API:解锁AI代码补全的无限集成可能
1. 项目概述:一个反向工程的“桥梁”如果你是一名开发者,并且对 GitHub Copilot 的智能代码补全能力印象深刻,但同时又希望能在自己偏爱的编辑器、IDE,甚至是命令行工具里直接调用它的能力,那么purocean/expose-github…...
Adobe Illustrator智能填充神器:Fillinger脚本的终极使用指南
Adobe Illustrator智能填充神器:Fillinger脚本的终极使用指南 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 你是否曾经在Adobe Illustrator中面对数百个需要均匀分布的…...
OpenClawWatch:本地优先的AI智能体监控工具,实现成本、安全与行为全链路追踪
1. 项目概述:为什么我们需要一个“本地优先”的AI智能体监控工具?如果你正在开发或运行能够自主执行任务的AI智能体,比如自动处理邮件、调用API、操作文件,甚至进行线上交易,那么你肯定经历过这样的焦虑时刻࿱…...
AgentStack:构建生产级AI智能体应用的一站式平台
1. 项目概述:AgentStack,一个为AI智能体打造的“操作系统”如果你正在开发AI应用,或者想让你的产品具备AI能力,那你一定遇到过这样的困境:大模型能力虽强,但让它稳定、可控、安全地接入你的业务系统&#x…...
