首页 > 其他分享 >[TS手册学习] 02_类型收窄 Narrowing

[TS手册学习] 02_类型收窄 Narrowing

时间:2023-11-29 22:55:21浏览次数:35  
标签:02 语句 收窄 TS number padding 类型 input

TS官方手册:TypeScript: Handbook - The TypeScript Handbook (typescriptlang.org)

一个变量如果声明为联合类型,而后续操作需要针对其具体的单一类型做不同处理,这个过程就叫做类型收窄(Narrowing)。

常见的做法或情形有以下:

typeof 类型保护(type guards)

typeof是 JS 中的操作符,需要注意typeof对象、数组、null都会返回object

真值收窄(Truthiness narrowing)

0NaN""0nnullundefined都会被隐式转换为false,属于假值,其它的值是真值。依据这个规则也可以收窄类型。

等值收窄(Equality narrowing)

在 JS 中,全等判断符===要求两边类型一致,以此也可以排除一些类型,从而实现收窄类型。

in 操作符收窄

in操作符检查指定的属性是否在指定的对象或其原型链中。

instanceof 收窄

instanceof运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。

赋值语句(Assignments)

TS 可以根据赋值语句的右值的类型收窄左值。

image-20231127221150198

控制流分析(Control flow analysis)

基于可达性的代码分析就是控制流分析,关注代码中的ifwhile等条件控制语句。

如果代码达到了某个区域,而根据条件控制语句可以得知:如果变量X是类型A,无法到达此区域,那么就可以推断出到达此区域的变量X的类型不可能是A。

于是类型收窄。

function padLeft(padding: number | string, input: string) {
  if (typeof padding === "number") {
    return new Array(padding + 1).join(" ") + input;
  }
  return padding + input;
}

在第一个 if 语句里,因为有 return 语句,TypeScript 就能通过代码分析,判断出在剩余的部分 return padding + input ,如果 padding 是 number 类型,是无法达到 (unreachable) 这里的,所以在剩余的部分,就会将 number类型从 number | string 类型中删除掉。

标签:02,语句,收窄,TS,number,padding,类型,input
From: https://www.cnblogs.com/feixianxing/p/typescript-handbook-type-narrowing.html

相关文章

  • 2023.11.29——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.百度图像增强SDK明日计划:学习......
  • 2023-2024 20231313《计算机基础与程序设计》第十周学习总结
    2023-202420231313《计算机基础与程序设计》第十周学习总结作业速达作业课程班级链接作业要求计算机基础与程序设计第十周学习总结作业内容计算机科学概论第12,13,14章《C语言程序设计》第9章并完成云班课测试,信息系统、数据库与SQL、人工智能与专家系统、人工......
  • 2023-11-29 闲话 垃圾桶是这里吗
    算法竞赛学不了一点。刷点b站视频吧。纯纯当作水博客用,看再多哔哩哔哩也和研究怎么拍个照片让机器把力矩学了没有半毛钱关系是吧。昨天刷了一个参加IROS2022kyoto的分享。现在仍然有印象的几点是:advisor觉得他很social,问他有没有经验。他说大概可以先加入一些小团体......
  • 用户体验设计:产品设计从需求到交互 -02
    范围层面的用户体验设计这部分聚焦于产品设计的范围层面。作者介绍了如何理解和定义用户需求、进行用户研究、创建用户故事和场景等内容。用户研究和需求定义在产品设计过程中扮演着关键角色,帮助将用户需求转化为可执行的产品设计方案。读书笔记:用户研究是理解用户需求的关键工......
  • 2023-11-29
    packagerjgz.suanTi;importrjgz.BinaryOperation;importrjgz.Exercise;importjavax.swing.*;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importstaticrjgz.suanTi.JDBC.add;importstaticrjgz.suanTi.JDBC......
  • 2023.11.29 日记 Take it easy
    很不想把文化课写到日记里。但今天有点烦了。考试考的内容是要通过刷题得知的,并非学习。我已经在别的平台抱怨过很多次当今教育现状了,无济于事是肯定的,反而会打消学习的积极性。由于训练原因欠了很多课,再加上两个学校的进度不同、考试时间不同,我的学习成果实在像是被虫蛀了一样......
  • 红队开发学习----魔改cobaltstrike学习(持续更新)
    目录环境和工具准备反编译CobaltStrike_4.4_000.jarIdea项目HelloWorld测试代码去除凭证读取teamserver端配置修改端口证书profile配置JA3|JA3S/JARM指纹修改源码层面修改stager导致配置泄漏修改xor密钥(未进行,没研究明白,怕改崩了)修改stager下载路径的长度修复一个漏洞参考文......
  • DASCTF 2023 & 0X401七月暑期挑战赛-web复现
    别问为什么不复现十一月的那个比赛,因为不会wwwww。EzFlask进去就有源码了,先cv到编辑规范看一下:importuuidfromflaskimportFlask,request,session,jsonfromsecretimportblack_listapp=Flask(__name__)app.secret_key=str(uuid.uuid4())defcheck(data):......
  • 2023-2024-1 学期20232423《网络空间安全导论》第四周学习总结
    教材学习——系统安全基础系统安全的两层含义:①以系统思维应对安全问题;②应对系统所面临的安全问题4.1系统安全概述时代在不断发展,系统安全也在不断演变:从二十世纪四十年代的第一台计算机,五十年代的第一个操作系统,六十年代的第一个分时系统CTSS、第一个安全操作系统Adept-50......
  • 2023-2024-1 20232404 《网络空间安全导论》第4周学习总结
    教材学习内容总结4.1系统安全概述世界上第一台通用电子计算机ENIAC,是纯粹的硬件裸机。世界上第一个安全系统Adept-50,属于分时系统。自外观察法是通过观察系统输入输出来分析系统的行为。一个系统是一个统一的整体,系统中的元素紧密关联。自内观察者属于系统的某个部分。......