14. TypeScript类型保护(类型缩小、类型守卫)

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

TypeScript类型保护的方式

类型断言

类型断言是一种告诉编译器“相信我,我知道我在做什么”的方式。它不进行特殊的数据检查和解构。它没有运行时的影响,只是在编译阶段起作用。TypeScript假设你,程序员,已经进行了必要的检查。

let someValue: any = "this is a string";
// 使用类型断言来告诉编译器someValue是一个字符串
let strLength: number = (<string>someValue).length;

类型谓词

类型谓词是一种特殊的返回值为 arg is T 的函数,其中 arg 是当前函数的一个参数,T 是任意类型。这种类型谓词的使用可以帮助TypeScript更好地理解代码的逻辑。

function isFish(pet: Fish | Bird): pet is Fish {// 如果pet有swim属性,那么它就是Fish类型return (pet as Fish).swim !== undefined;
}

instanceof关键字

instanceof关键字是JavaScript的一个标准操作符,TypeScript在类型保护中也支持它。

if (pet instanceof Fish) {// 如果pet是Fish类型,那么我们可以调用swim方法pet.swim();
}

in关键字

in操作符可以用来检查一个对象是否具有某个属性。在类型保护中,我们可以使用in操作符来区分一个联合类型的不同类型。

function move(pet: Fish | Bird) {if ("swim" in pet) {// 如果pet有swim属性,那么它就是Fish类型return pet.swim();}return pet.fly();
}

用户自定义的类型保护

用户可以通过创建自己的类型保护函数来创建自定义的类型保护。

function isNumber(x: any): x is number {// 如果x的类型是number,那么返回truereturn typeof x === "number";
}

typeof关键字

typeof关键字在JavaScript中用于获取一个变量或表达式的类型。在TypeScript中,当我们需要区分函数、字符串、数字或布尔值等基本类型时,可以使用typeof关键字。

if (typeof pet === "string") {// 如果pet是字符串类型,那么我们可以调用trim方法console.log(pet.trim());
}

nullundefined检查

在TypeScript中,我们可以使用nullundefined来进行类型保护。这在处理可能为nullundefined的值时非常有用。

function printLength(str: string | null | undefined) {if (str !== null && str !== undefined) {// 如果str不是null或undefined,那么我们可以获取它的长度console.log(str.length);}
}

类型保护可以帮助我们在编译阶段发现可能的错误,提高代码的健壮性和可读性。然而,它也有一些局限性,例如,过度的类型保护可能会使代码变得复杂和难以理解。

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

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

相关文章

汇编基础-----常见命令基本使用

汇编基础-----常见命令基本使用 MOV&#xff1a;将数据从一个位置复制到另一个位置。 MOV destination, source例如&#xff1a; MOV RAX, RBX ; 将RBX寄存器中的值复制到RAX寄存器中ADD/SUB&#xff1a;将两个操作数相加或相减。 ADD destination, source SUB destinatio…

Python(3):条件语句+循环语句+逻辑运算符+符号优先级

文章目录 一、if语句1.if语句2.if 和 elif区别3.三元表达式 二、循环语句1.range函数和循环结束关键字2.while循环3.for循环 三、逻辑运算符1.and语句2.or语句3.not语句4.逻辑运算法的优先级 四、python运算符优先级和结合性一览表 一、if语句 1.if语句 1.if单分支语句 格式…

Python项目1 外星人入侵_外星人

在本章中&#xff0c;我们将在游戏《外星人入侵》中添加外星人。首先&#xff0c;我们在屏幕上边缘附近添加一个外星人&#xff0c;然后生成一群外星人。我们让这群外星人向两边和下面移 动&#xff0c;并删除被子弹击中的外星人。最后&#xff0c;我们将显示玩家拥有的飞船数量…

Python-configparser更新write保留注释

背景 python语言用来解析配置文件的模块是ConfigParser&#xff0c;python3中是configparser模块&#xff0c;在使用中经常用到write方法将配置项重新写入文件&#xff1a; config.ini文件&#xff1a; # 数据库配置 [database] # 主机 # IP host localhost # 端口 port 3…

从路由器syslog日志监控路由器流量

路由器是关键的网络基础设施组件&#xff0c;需要随时监控&#xff0c;定期监控路由器可以帮助管理员确保路由器通信正常。日常监控还可以清楚地显出通过网络的流量&#xff0c;通过分析路由器流量&#xff0c;安全管理员可及早识别可能发生的网络事件&#xff0c;从而避免停机…

关于STL容器线程安全性的问题

关于STL容器线程安全性的问题 STL容器&#xff08;如vector&#xff09;本身并不是线程安全的&#xff0c;因此在使用它们进行多线程编程时需要格外小心。即便写入操作&#xff08;由生产者执行&#xff09;是由单线程完成的&#xff0c;但在并发读取时&#xff0c;由于可能发…

程序员如何搞副业——中学生视角看职业拓展的深入探索

在数字化浪潮席卷全球的今天,程序员这一职业因其独特的魅力和广阔的发展前景而备受瞩目。作为一名中学生,虽然尚未步入职业领域,但提前了解程序员的副业之路,不仅可以帮助我们拓宽视野,还能为未来的职业规划提供有益的参考。 首先,个人项目开发是程序员搞副业的一个重要…

计算机中,逻辑端口

计算机中,端口是什么 在计算机领域中,端口(Port)是一个逻辑概念,用于标识计算机与外部设备或另一台计算机通信时的出入口。它是计算机与外部通信的途径,分为物理端口和逻辑端口两种。 物理端口:物理端口也被称为接口,是计算机主板上或其他设备上的硬件接口,如USB接口…

算法训练营第二十三天(二叉树完结)

算法训练营第二十三天&#xff08;二叉树完结&#xff09; 669. 修剪二叉搜索树 力扣题目链接(opens new window) 题目 给定一个二叉搜索树&#xff0c;同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[L, R]中 (R>L) 。你可能需要改…

SQLite数据库在Linux系统上的使用

SQLite是一个轻量级的数据库解决方案&#xff0c;它是一个嵌入式的数据库管理系统。SQLite的特点是无需独立的服务器进程&#xff0c;可以直接嵌入到使用它的应用程序中。由于其配置简单、支持跨平台、服务器零管理&#xff0c;以及不需要复杂的设置和操作&#xff0c;SQLite非…

【算法】排硬币 - 二分法/牛顿迭代

题目 假设有n枚硬币&#xff0c;要摆一个阶梯形&#xff0c;第一行1个&#xff0c;第二行2个&#xff0c;以此类推&#xff0c;看n枚硬币能摆多少行&#xff0c;返回行数。未摆满行的不算。 原理 二分法 先假设放 x 行需要 m 个硬币&#xff0c;用 m 与 n 对比&#xff0c;…

OpenGL着色器实现纹理合并显示

OpenGL着色器实现纹理合并显示 本文介绍了opengl下实现纹理的装载&#xff0c;同时借助顶点着色器和片源着色器实现两个不同外部纹理的合并显示。 目录 1 opengl下纹理的装载2 纹理合并效果显示3 完整的代码 1 opengl下纹理的装载 // 初始化GLFWif (!glfwInit()) {std::cerr …

从建表语句带你学习doris_数据类型

1、前言概述 1.1、doris建表模板 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [DATABASE.]table_name (column_definition1[,column_deinition2,......][,index_definition1,[,index_definition2,]] ) [ENGINE = [olap|mysql|broker|hive]] [key_desc] [COMMENT "table co…

共享低碳未来!科士达新一代工商业储能产品引爆ESIE 2024

4月11日&#xff0c;第十二届储能国际峰会暨展览会&#xff08;ESIE 2024&#xff09;在北京首钢会展中心盛大开幕&#xff0c;科士达以“数智光储&#xff0c;共享低碳未来”为主题&#xff0c;携多款工商业储能产品及解决方案惊艳亮相本次盛会。 展会首日&#xff0c;科士达展…

C/C++基础----运算符

算数运算符 运算符 描述 例子 两个数字相加 两个变量a b得到两个变量之和 - 两个数字相减 - * 两个数字相乘 - / 两个数字相除 - % 两个数字相除后取余数 8 % 3 2 -- 一个数字递减 变量a&#xff1a;a-- 、--a 一个数字递增 变量a: a 、 a 其中递…

VSCode中调试C++程序

目录 一、准备工作&#xff1a;安装插件 1、C/C插件 ​编辑 2、CMake插件 3、CMake tool插件 二、调试过程 1、debug 2、打断点 3、调C/C文件 每次重新调试的时候都忘了具体步骤&#xff0c;直接给自己写个备忘录好了。 一、准备工作&#xff1a;安装插件 1、C/C插件…

java二叉树前中后序遍历

代码随想录解题思路&#x1f192;力扣前序题目&#x1f192;力扣中序题目&#x1f192;力扣后序题目 递归遍历 // 前序遍历 class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res new ArrayList<>();preorder(root…

zabbix“专家坐诊”第236期问答

问题一 Q&#xff1a;我的trap里已经可以收到信息了&#xff0c;后续要怎么创建监控项呀&#xff1f; A&#xff1a;参考&#xff1a; 问题二 Q&#xff1a;snmp和snmp trap咋搞&#xff1f; A&#xff1a;你指的是如何开启这些协议还是如何做监控项&#xff1f; Q&#xff1…

Opentelemetry——Observability Primer

Observability Primer 可观测性入门 Core observability concepts. 可观测性核心概念。 What is Observability? 什么是可观测性&#xff1f; Observability lets us understand a system from the outside, by letting us ask questions about that system without know…

动态开辟字符串malloc

1. 定义一个指针 int *p; 直接给指针赋值会产生段错误 &#xff1a;*p c malloc 函数原型 void *malloc(size_t size) &#xff08;开辟的内容大小&#xff09; C库函数 void *malloc(size_t size)分配所需的内存空间&#xff0c;并返回一个指向它的指针。 作用&…