news 2026/11/1 23:09:38

Typescript - 类型守卫(typeof / in / instanceof / 自定义类型保护的类型谓词)通俗易懂详细教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Typescript - 类型守卫(typeof / in / instanceof / 自定义类型保护的类型谓词)通俗易懂详细教程

前言

类型守卫用于获取变量类型信息,通常使用在条件块语句中。类型守卫是返回布尔值的常规函数,接受一个类型并告诉 TypeScript 是否可以缩小到更具体的类型。类型守卫具有唯一的属性,可以确保测试的值返回的是布尔值类型。

TypeScript 使用了一些内置的 JavaScript 操作符(见下方),这些操作符用于确定一个对象是否包含属性。类型守卫可以让你指导 TypeScript 编译器在特定的上下文中推断出变量的特定类型,确保参数的类型与你指定的一致。

类型守卫非常类似于特征检测,允许您检测值原型和属性。

类型保护是可执行运行时检查的一种表达式,用于确保该类型在一定的范围内。 换句话说,类型保护可以保证一个字符串是一个字符串,尽管它的值也可以是一个数值。类型保护与特性检测并不是完全不同,其主要思想是尝试检测属性、方法或原型,以确定如何处理值。


Typescript 类型守卫主要在类型窄化时使用,其实现类型守卫主要有以下 4 种方式:

  1. typeof(类型判断)
  2. in(属性或方法判断)
  3. instanceof(实例判断)
  4. 自定义类型保护的类型谓词

typeof

该关键字或许您可能在 JavaScript 中见过,甚至使用过。

typeof 只能检查基本数据类型(不能检查复杂数据类型),比如下面这些:

string | number | bigint | boolean | symbol | undefined | object | function

使用方法很简单,如下代码所示:

// 姓名(字符串类型)letuname:string="王佳斌"// 判断其类型console.log(typeofuname)//string

in

它用于检查对象是否具有特定的属性,并使用该属性区分不同的类型。它通常返回一个布尔值,表示该属性是否存在于该对象中。

该操作符用于遍历目标类型的公开属性名,如下代码所示:

// 示例一constobj={name:'王佳斌',age:15}console.log('name属性是否存在于obj对象?','name'inobj)//"name属性是否存在于obj对象?", true// 示例二typeProperty='name'|'age'|'phoneNum';typePropertyObject={[keyinProperty]:string;}

instanceof

它是一个内置类型守卫,可用于检查一个值是否是给定构造函数或类的实例。

有了这个类型守卫,我们可以测试一个对象或值是否派生自一个类,这对于确定实例类型的类型很有用。

instanceof 关键字的基本语法如下:

objectVariable instanceof ClassName;

一个 instanceof 的例子,如下代码所示:

interfaceAccessory{brand:string;}// implements// 实现,一个新的类,从父类或者接口实现所有的属性和方法,同时可以重写属性和方法,包含一些新的功能// 一个类通过关键字implements声明自己使用一个或者多个接口。classNecklaceimplementsAccessory{kind:string;brand:string;constructor(brand:string,kind:string){this.brand=brand;this.kind=kind;}}classbraceletimplementsAccessory{brand:string;year:number;constructor(brand:string,year:number){this.brand=brand;this.year=year;}}constgetRandomAccessory=()=>{returnMath.random()<0.5?newbracelet('cartier',2021):newNecklace('choker','TASAKI');}letAccessory=getRandomAccessory();if(Accessoryinstanceofbracelet){console.log(Accessory.year);}if(AccessoryinstanceofNecklace){console.log(Accessory.brand);}

上面的 getRandomAccessory 函数返回一个 Necklace 或 bracelet 对象,因为它们都实现了 Accessory 接口。

Necklace 和 bracelet 的构造函数签名是不同的,用 instanceof 比较两个构造函数签名可以有效地确定类型。

自定义类型保护的类型谓词

这种自定义的方式更加灵活,如下代码所示:

// 验证是否是number类型functionisNumber(x:any):xisnumber{returntypeofx==="number";}// 验证是否是string类型functionisString(x:any):xisstring{returntypeofx==="string";}

调用函数传入参数(any 任意类型),如果类型正确则返回 true,反之 false。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/31 4:17:34

python_django微信小程序的的在线听书享听平台

文章目录 技术架构设计核心功能模块关键技术实现性能优化策略数据安全措施 系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 技术架构设计 Django作为后端框架&#xff0c;提供RESTful API接口&am…

作者头像 李华
网站建设 2026/10/31 3:53:56

从传统BI到大数据多维分析的迁移路径

从传统BI到大数据多维分析的迁移路径&#xff1a;从“固定报表”到“自由探索”的决策革命 1. 引入与连接&#xff1a;那些让分析师崩溃的“报表时刻” 凌晨三点&#xff0c;张磊揉着发红的眼睛盯着电脑屏幕——这是他这周第5次熬夜调整销售报表。作为某零售企业的BI分析师&…

作者头像 李华
网站建设 2026/10/30 10:45:37

中科驭数CEO鄢贵海:AI尚处“Day 1”,算力基建的价值外溢如同高铁

在过去两年中&#xff0c;全球资本对人工智能&#xff08;AI&#xff09;的追逐近乎狂热。然而&#xff0c;随着巨额资本开支与短期商业回报之间的剪刀差扩大&#xff0c;关于“AI泡沫”的论调自去年底以来甚嚣尘上。近日&#xff0c;中科驭数创始人、CEO鄢贵海在亚洲金融论坛期…

作者头像 李华
网站建设 2026/10/31 2:06:42

【信号处理】(超全45种特征提取)时域、频域、小波、信息熵等45种时频域特征提取方法matlab代码

&#x1f525; 内容介绍 时频域特征提取是信号处理领域中的关键技术&#xff0c;其目的是从非平稳信号中提取具有判别性的特征&#xff0c;以便用于后续的分析、识别和分类。随着科学技术的发展&#xff0c;各种时频域分析方法层出不穷&#xff0c;为解决复杂的信号处理问题提…

作者头像 李华
网站建设 2026/10/31 6:30:00

C++与物联网开发

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if find(begin, end, value)&#xff1a;查找第一个等于 value 的元素&#xff0c;返回迭代器&#xff08;未找到返回 end&#xff09;。find_if(begin, end, predicate)&#xff1a;查找第…

作者头像 李华
网站建设 2026/10/31 6:29:59

Moltbot(Clawdbot)架构与技术全解析:AI助手开发必学指南(建议收藏)

Moltbot是一个个人AI助手系统&#xff0c;采用模块化架构&#xff0c;通过本地优先的Gateway控制平面管理多渠道通信和智能体会话。系统支持13消息平台&#xff0c;具备语音唤醒、实时画布、工具系统等高级功能。基于TypeScript和Node.js构建&#xff0c;使用Pi Agent作为智能体…

作者头像 李华