TypeScript的类型谓词与控制流分析

目录

  • ts封装类型判断的问题
  • 类型谓词
  • TypeScript的“控制流分析”

ts封装类型判断的问题

在union.d.ts 中 全局声明一个 DataType

declare type DataType =| "RegExp"| "Object"| "Array"| "Function"| "String"| "Boolean"| "Number"| "Void"| "Null"| "Undefined";

然后在utils文件里封装一个用于判断类型的函数

/*** @description 判断値的类型* @param {any} value   要检查的值* @param {DataType} type  要检查的类型* @returns Boolean*/
export function isType(value: any, type: DataType) {if (type === "Void") {return value === null || value === undefined;}//Object 是一个构造函数,直接调用Object.toString,会在原型链上查找,而会先找到Function.prototype,而Function.prototype.toString()的作用不是用来检查类型的// 而Object.prototype 是通过 new Object() 创造的实例的原型//call:是Function.prototype 的方法,改变thisconst res = Object.prototype.toString.call(value);//[object Null] 、 [object Number]等return res === `[object ${type}]`;
}

然后我准备封装一个用于过滤对象属性的方法,此时用到了 isType,这时问题就出来了。

export function getFilterObj(source: Record<string, any>,exclude: string | string[]
) {if (isType(exclude, "String")) {/** ts报错  exclude 类型“string | string[]”上不存在属性“split”。 *   由于此处exclude依然可能是 string[] 类型,所以不能用字符串的方法。*/const { [exclude]: omitted, ...rest } = source;return rest;} else if (isType(exclude, "Array")) {...}
}

我自己封装的方法,ts在外部无法得知value是什么类型,因为返回值是Boolean类型。

类型谓词

类型谓词是一个特殊的函数签名,它在返回布尔值的同时,还告诉TypeScript在函数返回true时,某个参数的具体类型。这是通过在函数签名中使用 参数名 i s \color{orange}is is 目标类型 来实现的。
在返回值为 true 时,额外传递一些信息给调用者

/** 类型谓词 value is string */
// 返回值为true时,形参类型为string 类型
function isString(value: any): value is string {return typeof value === "string";
}function getName(source: string | string[]) {if (isString(source)) {// 类型校验通过,source为string 类型source.split("");}
}

但我们注意到,typeof 也可以ts校验通过

function getName(source: string | string[]) {if (typeof source === "string") {// 类型校验通过,source为string 类型source.split("");}
}

这里提到一点,就是 js 是运行时执行的,也就是说js的代码在编译时无法得知 source是什么类型,而ts是编译时执行的,而在编译时,source的类型就是自己写定的 string|string[] 类型。

TypeScript的“控制流分析”

但之所以ts最终校验通过,是因为 TypeScript的“控制流分析”,当你在TypeScript代码中使用 if (typeof source === “string”) { … } 这样的条件语句时,TypeScript的类型检查器(Type Checker)会利用这个条件来推断在条件块内部 source 变量的类型。

这是TypeScript的“控制流分析”(Control Flow Analysis)功能的一部分。 T y p e S c r i p t 的类型检查器会分析代码中的条件语句、循环等结构 \color{orange} TypeScript的类型 检查器会分析代码中的条件语句、循环等结构 TypeScript的类型检查器会分析代码中的条件语句、循环等结构,并根据这些结构中的条件来推断变量的类型。在这个例子中,当TypeScript看到 if (typeof source === “string”) { … } 时,它会在条件块内部将 source 的类型推断为 string,即使这个检查实际上是在运行时进行的。

这种类型推断只在语句内部有用

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

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

相关文章

Shell:一行命令如何实现采集某一进程一段时间内CPU使用率

首先&#xff0c;能想到使用top查看进程的CPU使用率&#xff0c;以java进程编号251346为例进行介绍 top -d 1 -p 251346 -d 表示每秒采集一次 CPU使用率是显示出来了&#xff0c;但这样只能在屏幕上原地刷新&#xff0c;我们希望能把数据每时每刻的数据都保存下来&#xff0c;…

vscode连接unbuntu失败,显示Downloading vs code server...

问题&#xff1a; vscode连接unbuntu失败&#xff0c;右下角显示&#xff1a;Downloading vs code server... 且当再次输入密码时&#xff0c;仍然出现&#xff1a;Downloading vs code server... 重复多次&#xff0c;无法解决。 解决办法&#xff1a; 这是因为服务器端的…

华为OD机试(C卷,200分)- 字符串拼接、田忌赛马

(C卷,200分)- 字符串拼接 题目描述 给定 M&#xff08;0 < M ≤ 30&#xff09;个字符&#xff08;a-z&#xff09;&#xff0c;从中取出任意字符&#xff08;每个字符只能用一次&#xff09;拼接成长度为 N&#xff08;0 < N ≤ 5&#xff09;的字符串&#xff0c; 要求…

凌风云 - 十大网盘资源搜索 Ver 6.0 版正式上线

《凌风云》作为网盘资源专业搜索领域的佼佼者&#xff0c;汇聚了国内十大网盘的丰富资源&#xff0c;凌风云搜索弥补其他搜索引擎可能无法搜索到相关资源的缺陷&#xff0c;作为专业的搜索引擎服务网络平台&#xff0c;您只需输入关键词&#xff0c;通过智能算法精准匹配&#…

C语言2D游戏

目录 开头程序程序的流程图这个游戏的效果结尾 开头 大家好&#xff0c;我叫这是我58。在今天&#xff0c;我用C语言编译出了我的第一个2D游戏。如果你想就看这个2D游戏或者与之相关的内容话&#xff0c;就看下下面的内容吧。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #defi…

第六次作业

一、视图作业 1、创建视图v_emp_dept_id_1&#xff0c;查询销售部门的员工姓名和家庭住址 2、创建视图v_emp_dept&#xff0c;查询销售部门员工姓名和家庭住址及部门名称。 3、创建视图v_dept_emp_count(dept_name,emp_count,avg_salay)&#xff0c;统计每个部门人数并计算平均…

Pandas基础03:数据排序与增删

上一节我们介绍了通过按行索引和按列索引找出相关数据的方法。本章节将进一步介绍如何筛选数据&#xff0c;并对数据进行排序、增删的方法。 示例表格和上一节相同。 1.数据筛选 Python中可以通过区域筛选&#xff0c;即获取某几行某几列的方法得到数据。例如&#xff0c;我要…

数据分表和分库原理

数据分表和分库是数据库设计中常见的扩展和优化手段&#xff0c;用于解决大数据量下的性能瓶颈问题。以下是数据分表和分库的原理&#xff1a; 一、数据分表&#xff08;Sharding&#xff09; 原理&#xff1a; 数据分表是将一个大的数据库表按照一定的规则拆分成多个较小的…

pwn误区的buffer

注意栈顶是闭合的&#xff0c;栈底才是打开的 栈图&#xff1a; |--------------------------| | | | | buffer溢出的时候&#xff0c;是从栈底到栈顶方向

vue3的常用 Composition API有哪些?

Vue.js 3.0 引入了 Composition API&#xff0c;作为一种新的组织组件逻辑的方式&#xff0c;相比于传统的 Options API&#xff0c;Composition API 提供了更灵活、更可复用的代码组织方式。 以下是 Vue 3.0 中常用的 Composition API&#xff1a;setup() 函数&#xff1a; s…

Llama-factory源码详细解读

微调 采用逐行调试的方法&#xff0c;细节来看SFT代码 #mermaid-svg-ygujiVh1wygmSv74 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ygujiVh1wygmSv74 .error-icon{fill:#552222;}#mermaid-svg-ygujiVh1wygmSv74…

实施团队人员配备计划

实施团队人员 &#xff08;一&#xff09;项目经理职责 全面负责项目的规划、执行和监控&#xff0c;确保项目按时、按质量要求完成。与客户沟通&#xff0c;明确项目需求和目标&#xff0c;协调各方资源&#xff0c;解决项目中的重大问题。制定项目计划和预算&#xff0c;监…

LINUX命令行curl指令与python内置urllib模块

urllib是python御用的易用的轻便模块&#xff0c;curl是Linux功能强大的命令行工具&#xff0c;都是参与Web的利器。 (笔记模板由python脚本于2024年07月10日 18:41:12创建&#xff0c;本篇笔记适合喜欢Python和Linux的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&…

【嵌入式DIY实例-ESP8266篇】-LCD1602显示DS1631传感器数据

LCD1602显示DS1631传感器数据 文章目录 LCD1602显示DS1631传感器数据1、DS1631介绍2、硬件准备与接线3、代码实现本文介绍了如何将 ESP8266 NodeMCU 板 (ESP-12E) 与 DS1631 数字温度传感器连接,其中温度值(摄氏度和华氏度)打印在 1602 LCD 屏幕上。 本项目中使用的 1602 LC…

最佳 iPhone 解锁软件工具,可免费下载用于电脑操作的

业内专业人士表示&#xff0c;如果您拥有 iPhone&#xff0c;您一定知道忘记锁屏密码会多么令人沮丧。由于 Apple 的安全功能强大&#xff0c;几乎不可能在没有密码或 Apple ID 的情况下访问锁定的 iPhone。 “当我忘记密码时&#xff0c;如何在没有密码的情况下解锁iPhone&am…

【Cesium开发实战】地下模型功能的实现,可设置透明度及显示隐藏

Cesium有很多很强大的功能&#xff0c;可以在地球上实现很多炫酷的3D效果。今天给大家分享一个可自定义高度的电子围栏。 1.话不多说&#xff0c;先展示 地下模型 2.设计思路 按项目需求&#xff0c;需要对加载在地下部分的模型控制显示隐藏&#xff0c;以及透明度的设置。增…

仕考网:公务员考试的录取流程

公务员考试的录取流程分很多个阶段&#xff0c;以下是流程介绍&#xff1a; 1. 报名阶段&#xff1a;考生需根据公布的招聘信息和岗位要求进行报名。 2. 笔试阶段&#xff1a;公务员笔试&#xff0c;包括申论和行测两部分。 3. 成绩公布与面试资格&#xff1a;笔试合格者将获…

编译原理:词法分析器 Flex工具的使用(简单易懂)

目录 词法分析器 & Flex工具的使用背景&#xff1a;编译器和解释器概念区别编译器的实现 词法分析器(Lexer)工具(Flex)安装Flex目标程序&#xff1a;verilog代码Flex程序格式DeclarationsDefinitionsRulesUser subroutines如何通过flex读入文件&#xff1f; 完整程序编译&a…

最小生成树(算法篇)

算法之最小生成树 最小生成树 概念&#xff1a; 最小生成树是一颗连接图G所有顶点的边构成的一颗权最小的树&#xff0c;最小生成树一般是在无向图中寻找。最小生成树共有N-1条边(N为顶点数)。 算法&#xff1a; Prim算法 概念&#xff1a; Prim(普里姆)算法是生成最小生…

每天两道Java面试题(一)

1、this关键字和super关键字的区别及联系 this关键字用在本类中。 在类的内部&#xff0c;可以在任何方法中使用this引用当前对象。 this关键字是用来解决全局变量和局部变量之间的冲突。 this()可以调用同类中重载的构造方法&#xff0c;并且需要放在第一行。 super关键字…