当前位置: 首页 > news >正文

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。

http://www.jsqmd.com/news/323303/

相关文章:

  • python_django基于微信小程序的移动医院挂号预约系统
  • 接口(集成)平台设计(一)-服务,接口,数据集和数据源
  • python_django基于微信小程序的竞赛报名系统_13348
  • 权威测评|微信小程序公司 TOP 名单,教你锁定适配服务商
  • python_django基于微信小程序的自习室座位预约付费打卡系统
  • 小程序 SaaS 制作平台超全攻略,找对适配伙伴赋能创业
  • python_django基于微信小程序的服装商城销售管理平台
  • 严选国内优质微信小程序开发公司:适配各类生意场景
  • python_django基于微信小程序的校园店铺商城电子商务系统
  • 一文吃透 Spring 生态核心:IoC/DI 原理、Bean 管理与实战指南
  • python_django基于微信小程序的班级学生作业管理助手
  • 单调队列优化dp
  • python_django个性化推荐小学生古诗词情景化学习小程序
  • 本地餐饮外卖专属:小程序开发公司甄选,生意高效跑通技巧
  • Windows CMD文件编辑器:从内置工具到第三方方案
  • 2026程序员转行AI大模型全攻略:后端开发轻松转型大模型应用开发,零基础突围路线图!非常详细建议收藏!
  • 从传统BI到大数据多维分析的迁移路径
  • Vite代理配置中changeOrigin: true的作用详解(转发请求时的Host头,解决后端对Host头的校验)Origin头、403/400错误、Invalid Host header
  • 2026最新小程序开发平台TOP实战测评:适配不同场景的选型方案
  • agent skills好像是把原本mcp的方法改成cli方法放在skill里
  • STM32F1xx HAL_FLASH:扩展库核心应用指南
  • STM32F1xx HAL_FLASH库实战指南
  • 基于Impress.js的智能多面棱柱演示器:技术与创意深度解析
  • 区块链|钱包开发的相关问题
  • 程序员必学!企业级大模型落地全攻略:6-12个月实现AI转型的关键路径
  • Python flask微信小程序的小区社区团购服务系统
  • AI重塑软件工程:从需求到部署的全链路智能化革命
  • 大模型开发完整流程指南:从零开始打造你的AI应用_2026版最新大模型应用开发流程(非常详细)
  • 实测玄晶引擎2.7.4|40+迭代落地,AI创作+智能获客双升级,开发者与企业必看
  • Elasticsearch慢查询优化:大数据场景下定位与解决方法