Typescript高级: is 类型守卫

深入理解TypeScript类型守卫(Type Guards):原理与实践 TypeScript作为JavaScript的超集,其核心价值在于为JavaScript添加了静态类型系统。而在这一类型系统中,**类型守卫(Type Guards)**扮演着至关重要的角色。本文将全面剖析类型守卫的概念、工作原理、实现方式以及在实际开发中的应用场景,帮助开发者更好地利用这一强大特性编写类型安全的代码。 阅读详情

概述

  • 在 TypeScript 中,is 关键字主要用于类型守卫(Type Guards)
  • 类型守卫是一种表达式,它执行一些运行时检查,并缩小变量的类型范围
  • is 关键字通常与类型断言一起使用,以提供更精确的类型信息

基本使用

  • 假设我们有一个联合类型,它可以是多种类型之一
  • 在某些情况下,我们可能希望缩小这个类型的范围,以进行更具体的操作
  • 这就是 is 类型守卫的用途所在

1 ) 示例

type Shape = Circle | Square | Triangle;  
  
interface Circle {  
    kind: "circle";  
    radius: number;  
}  
  
interface Square {  
    kind: "square";  
    sideLength: number;  
}  
  
interface Triangle {  
    kind: "triangle";  
    base: number;  
    height: number;  
}  
  
function isCircle(shape: Shape): shape is Circle {  
    return shape.kind === "circle";  
}

// 使用 isCircle 函数来缩小 shape 变量的类型范围
function calculateArea(shape: Shape) {  
    if (isCircle(shape)) {  
        // 在这里,TypeScript 知道 shape 是 Circle 类型  
        return Math.PI * shape.radius ** 2;  
    }  
    // ... 其他形状的面积计算
    // 注意:这里应该包含对所有其他形状的处理,否则如果传入的 shape 不是 Circle 类型,函数将不会返回任何值。  
    throw new Error("Unsupported shape type");
}

// 定义一个圆的变量  
const myCircle: Circle = {  
    kind: "circle",  
    radius: 5 // 圆的半径为 5  
};

// 调用 calculateArea 方法计算圆的面积  
const area = calculateArea(myCircle);  
console.log(`The area of the circle is: ${area}`);
  • 在上面的代码中,我们定义了一个 isCircle 函数,它接受一个 Shape 类型的参数,并返回一个布尔值
  • 通过使用 is 关键字,我们告诉 TypeScript,如果这个函数返回 true,那么 shape 参数就一定是 Circle 类型
  • 在 calculateArea 函数中,当我们调用 isCircle(shape) 并检查其返回值时
  • TypeScript 知道如果返回 true,则 shape 一定是 Circle 类型
  • 因此,我们可以安全地访问 shape.radius 属性,而不用担心类型错误

注意事项

  • is 关键字只与类型守卫一起使用,用于提供更精确的类型信息
  • 类型守卫并不改变变量的实际类型,它们只是告诉 TypeScript 编译器在特定条件下变量的类型是什么
  • 除了使用 is 关键字外,还可以使用其他方式来实现类型守卫
  • 比如使用 typeof、instanceof 或自定义的守卫函数
TypeScript类型守卫错误?`is`关键字的类型谓词设计模式 TypeScript类型守卫是确保代码安全性的关键机制,本文深入解析is关键字的正确使用模式。首先揭示常见误用场景,如未返回类型谓词或逻辑声明不一致;随后系统介绍基础类型守卫、联合类型收窄和递归类型检查三种设计模式,提供典型代码示例;最后给出性能对比表和最佳实践指南,包括命名规范、实现原则和组合使用建议。文章还解决了泛型结合与可选属性处理等常见问题,并附上类型守卫设计模式速查表,帮助开发者避免类型推断失效问题。 阅读详情

相关推荐

【高频考点精讲】TypeScript类型守卫:typeof、instanceof和自定义

有时候内置的类型守卫不够用,比如你想检查一个对象是否有特定属性。// 全栈老李划重点:返回值类型是"parameterName is Type"的形式pet.meow();// TypeScript知道这里pet是Cat类型} else {pet.bark();// 所以这里只能是Dog类型自定义类型守卫的返回值类型很特殊,是的形式。这告诉TypeScript:"如果这个函数返回true,那么参数就是这个类型"。

全栈老李的博客 731

24.【TypeScript 教程】is 关键字

第 7 行,可以看到 TypeScript 抛出了一个错误提示,一个 unknown 类型的对象不能进行 toUpperCase() 操作,可是在上一行明明已经通过。如果需要封装一个类型判断函数,你应该第一时间想到它,本节列出了一些常用的类型判断函数以供参考。关键字经常用来封装"类型判断函数",通过和函数返回值的比较,从而缩小参数的类型范围,所以类型谓词 is 也是一种类型保护。关键字一般用于函数返回值类型中,判断参数是否属于某一类型,并根据结果返回对应的布尔类型。本节介绍 TypeScript 中的。

这是一个web全栈开发的博客,取其精华去其糟粕,争取让大家一看就懂,一学就会,一用就成~ 1651

【TypeScript】TS类型守卫(六)

类型守卫主要是用来**判断未知类型是不是所需要的类型**。类型守卫主要包括四种方式:in,typeof, instanceof,自定义类型

编码世界 1万+

08-TypeScript-中-is-关键字

在使用类型保护时,TS 会进一步缩小变量的类型。例子中,将类型从 any 缩小至了 string;类型保护的作用域仅仅在 if 后的块级作用域中生效。金点网络/数媒派作者:jamin。

zhangjun133133的博客 1365

calibration的“前世今生”——从simulink开发到CANape的XCP标定

整体思路 备注: elf可简单的看作为hex和map的集合,其中包括可执行的程序、变量及其对应的地址(simulink生成代码是也可以勾选生成ASAP2的a2l文件,有变量但变量对应的地址为空,只有编译后才分配地址) 定义变量是观测值还是标定值需要在simulink中的数据字典定义变量存储类型,详见simulink系列。 1. 前期准备A2L的制作 安装完成CanApe软件 , 插上CanApe硬件( 如:vector 1640A)。打开A2L编辑软件 ASAP2 Editor(注意不是ASAP2 Vi

IHTY_NUI的博客 1万+

TC387 MCMCAN Message RAM配置详解:Tx Buffer与Rx FIFO地址布局

在嵌入式CAN/CAN FD通信系统中,缓冲区和FIFO是数据收发的核心机制,而AURIX TC3xx系列单片机将这一机制集成在了MCMCAN模块专用的Message RAM中。这是一块由CAN控制器独占的内存区域,开发人员需要按照寄存器规范手动划分Tx Buffer、Rx FIFO、过滤元素等子区间。合理的RAM布局能确保不同功能区域互不重叠、有序排列,避免数据覆盖与错帧。通过掌握TXBC、RXF0C等配置寄存器的字段含义,结合实用的地址布局表,可以显著降低多节点CAN通信的调试成本。本内容面向使用TC3

weixin_34226182的博客 224

Typescript: “is“ 的用途

function isStr(p): p is string{ return typeof p === 'string'; } function isStr2(p): boolean{ return typeof p === 'string'; } // 上述两个function 编译后的结果一样 // 区别如下: function str2Uppercase(param) { console.log(param); // param: any if (isStr(pa.

好好学习,天天向上 ~ 1260

Tesseral 建立地震模型

0. 前言 本节内容主要是总结如何使用 Tesseral 工具建立模型。 1. 模型建立步骤 设置模型的宽度和深度 此处默认都为1000,之后点击“确定” 建立地层 绘制新的地层 右键点击“New polygon” 绘制地层,设置第二个层的名字和纵波速度 绘制第三层,第三层覆盖在前一个层上 第四层如上,第四层如果是最后一层,绘制该层时,要将深度1000包围。 设置观测系统 设置炮点 设置子波为雷克子波,频率设置为30 检波点设置 运行模型 设置好如上选择后,

weixin_41857483的博客 6540

TypeScript中的 | 分隔符、& 运算符、类型谓词is

TypeScript中的 | 分隔符、& 运算符、类型谓词is

m0_45093055的博客 2031

手持式激光测距仪全套方案

激光测距全套方案,包括原理图、源代码、PCB、BOM、光学部分资料,结构、特殊元件数据手册及供应商联系方式,提供调试技术文档。全套方案已成功打板验证,实现0.05~50m测量范围,精度在+/—1.5mm,激光波长635~650nm,功率《1mW。方案预留了TTL串口、RS485接口,可通过串口助手看到测量数据,可自行DIY或者商业开发。无论是电路小白,还是技术大拿,都能通过方案资料成功做出一套激光测距仪。

Laser01的博客 2055

软件各项会议评审意见模版

读梅老师主编的书,觉得评审意见模板很有参考价值和实用价值,帮梅老师安利一波,顺便记一下笔记。 《系统/子系统规格说明》评审意见模板 20XX年XX月XX日,XXX(主管机关)在XXX(会议地点)主持召开了“《XXX(产品名称)系统规格说明》评审会”。参加会议的有XXX机关,XXX院校,XXX研究所共XX名代表(名单见附件1),会议成立了评审组(名单见附件2),听取了XXX(单位)做的《XXXX报告》。经讨论质询,形成评审意见如下: 系统规格说明对系统的研制目标和范围、工作状态、运行方式以及所要满足的能力需

赵星汉同学的博客 1万+

TypeScript 中的 is 关键字(类型谓词)的用法

is是 TypeScript 中的一个特殊关键字,用于,它允许你在自定义类型守卫函数中明确指定变量的类型。

Honiler的博客 665

一文搞懂深度学习:最全神经网络介绍

本文是深度学习系列文章的第二篇,我们将深入探讨各种类型的人工神经网络,探索它们独特的特性和应用。

2402_82802238的博客 2801

TypeScript学习-第8章:高级类型

上一章咱们搞定了泛型这个“类型复用神器”,以为能在TS世界横着走了?可一碰到复杂业务场景就懵了:既要让变量支持多种类型,又要精准区分类型做不同操作;既要合并多个接口的属性,又要避免类型冲突……别急,TS的“高级类型”就是为解决这些“疑难杂症”而生的!它们就像类型界的乐高积木,能通过组合、判断、守卫,拼出适配复杂业务的精准类型。今天咱们就用接地气的方式,吃透这些高级玩法,从此告别“类型写死”和“any兜底”。

Amon的专栏 906

【WRF安装】完整自动化 WRF-ARW/WRF-Chem 安装脚本(多服务器测试)

【WRF安装】完整自动化 WRF-ARW/WRF-Chem 安装脚本(多服务器测试)

WW、forever的博客 285

告别传统RAG的痛点!Agent Skills让知识库检索更智能(本地知识库搭建新思路:用Agent Skills实现渐进式检索)

传统RAG在知识库检索中存在文档结构丢失、Token消耗大等问题 📚 Agent Skills通过分层索引、渐进式检索等设计,实现了更智能的本地知识库检索方案 🤖 本文详细介绍了Agent Skills的核心设计理念、与传统RAG的对比以及实践建议,帮助你搭建高效的知识库系统 ✅

XiaoqiangClub的博客 697

TypeScript高级类型

其中,高级类型是TypeScript最引人入胜的特性之一,它不仅能帮助开发者更精确地描述复杂的数据结构,还能通过类型组合和运算实现灵活的类型逻辑。交叉类型通过`&`运算符将多个类型合并为一个新类型,常用于组合对象或接口。例如,`User & Admin`会同时包含两者的所有属性。而联合类型通过`|`表示“或”关系,比如`string | number`允许变量为字符串或数字。映射类型通过`in`关键字动态生成新类型,例如`Partial。**交叉类型与联合类型****映射类型与条件类型**

iqfkye_855的博客 205

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

TypeScript 类型守卫:从编译原理到高级模式

本文深入探讨了TypeScript类型守卫的底层原理与实现机制。类型守卫本质上是类型收缩(Type Narrowing)的过程,通过控制流分析(Control Flow Analysis)在运行时条件分支中推断精确类型。文章从类型理论基础出发,分析了类型收缩与子类型推理的数学表示,并展示了编译器如何实现类型环境更新和类型收缩算法。控制流分析作为类型守卫的基础设施,通过跟踪程序执行路径中的类型变化,实现了基于条件表达式(如typeof、instanceof、in操作符等)的类型细化。这些机制共同构成了Type

老前端的功夫 1359

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

掌握TypeScript类型守卫:从基础到高级的完整实践指南

TypeScript类型守卫(Type Guards)是提升代码健壮性的关键工具,它能帮助开发者在编译阶段捕获类型错误,确保运行时类型安全。本指南将从基础概念到高级应用,全面解析TypeScript类型守卫的实现原理与实战技巧,基于interactive-tutorials项目中的最佳实践,让你轻松掌握这一强大特性。 ## 什么是TypeScript类型守卫? 类型守卫是TypeScript提

gitblog_00274的博客 563

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

学习TypeScript类型守卫

结合题目实现实现一个函数支持任意类型如果是对象,就检查里面的属性,如果里面的属性是number就取两位,如果是string就去除左右空格如果是函数就执行let value;value()})fn(obj)乍一看没啥问题 一运行就报错他说找不到a当函数被单独调用时(例如 value()),函数内部的 this 会指向全局对象(在浏览器环境下是 window)修改如下let value;data[key]() //修改这儿})fn(obj)第一个问题解决了。

qq1195566313的博客 3161

【TypeScript系列】高级类型

交叉类型是将多个类型合并为一个类型。 这让我们可以把现有的多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性。 例如,`Person & Serializable & Loggable`同时是`Person`_和_`Serializable`_和_`Loggable`。 就是说这个类型的对象同时拥有了这三种类型的成员。

爱学习的小码农 1482

《现代Typescript高级教程》类型守卫

@charset "UTF-8"; .markdown-body { font-family: -apple-system, system-ui, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Hiragino Sans GB...

linwu的博客 399

类型收窄 vs 类型守卫:TypeScript 中的类型细化机制详解

本文深入解析了TypeScript中类型收窄(Type Narrowing)和类型守卫(Type Guard)的关系与区别。类型收窄是编译器将宽泛类型缩小为具体子类型的过程,而类型守卫是触发收窄的运行时检查逻辑。文章详细介绍了三种类型守卫形式:内置操作符(typeof/instanceof/in)、自定义类型谓词函数和可辨识联合,并通过示例展示了它们如何实现类型收窄。同时澄清了常见误区,指出类型守卫是"手段",类型收窄是"结果",二者配合可提升代码类型安全性。最后给出

Wang Chengchen's Blog 834

【TypeScript】类型守卫

实现一个函数,该函数可以传入任何类型。但是如果是object就检查里面的属性,如果里面的属性是number就取两位小数;如果是string就去除左右空格;如果是函数就执行。// 同理以下写法let value// 遍历不能使用 for in 因为 for in 会遍历原型链上的属性// value();})a: 1.1234,console.log(this, '函数执行')fn(obj)

小秀的博客 672

TypeScript 教程(四):高级类型与类型操作

在前三章中,我们介绍了 TypeScript 的基础知识、函数与对象类型。在本章中,我们将探讨更高级的类型和类型操作,包括联合类型、交叉类型、字面量类型、类型断言、类型兼容性和类型守卫等内容。通过这些高级特性,你将能够编写出更加灵活和强大的代码。系列文章列表TypeScript 教程(一):安装和tsc编译TypeScript 教程(二):类型与类型注解TypeScript 教程(三):函数与对象类型TypeScript 教程(四):高级类型与类型操作TypeScript 教程(五):接口与类。

前端探索者 1659

TypeScript高级类型技巧语法解析+案例

TypeScript高级类型技巧解析:类型守卫与类型断言 本文重点介绍了TypeScript中两种关键的高级类型技巧。类型守卫通过运行时类型判断(typeof、instanceof、自定义函数、字面量)缩小变量类型范围,确保类型安全操作,适用于处理unknown类型和联合类型分支。类型断言则允许开发者明确指定变量类型(使用as语法),适用于编译器无法推断但开发者确定类型的场景,如DOM元素操作。这些技巧能有效提升代码类型安全性,解决复杂场景下的类型处理问题,是TypeScript进阶开发的必备技能。

鹏多多的博客 1161
上一篇: Github: Github actions自动化工作原理与多workflow创建和部署
下一篇: Typescript高级: 函数重载和constructor重载
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值