我的编程空间,编程开发者的网络收藏夹
学习永远不晚

TypeScript学习笔记之类型缩小

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

TypeScript学习笔记之类型缩小

类型缩小

什么是类型缩小呢?

类型缩小的英文是 Type Narrowing;

我们可以通过类似于 typeof padding === "number" 的判断语句,来改变TypeScript的执行路径;

在给定的执行路径中,我们可以缩小比声明时更小的类型,这个过程称之为缩小;

而我们编写的 typeof padding === "number 语句可以称之为 类型保护( type guards);

常见的类型保护有如下几种:

  • typeof
  • 平等缩小(比如===、 !==)
  • instanceof
  • in
  • 等等…

我们主要讲解typeof、平等缩小、instanceof、in这四种

typeof

在TypeScript中,检查返回的值typeof是一种类型保护:因为TypeScript对如何typeof操作不同的值进行编码。

例如我们有下面一个常见, 封装一个函数, 函数要求传入参数ID, 传入的ID有可能是string类型有可能是number类型

当传入的ID是string类型时, 要求将ID的字母全部转为大写

function printID(id: string|number) {
  if (typeof id === "string") {
    console.log(id.toUpperCase())
  } else {
    console.log(id)
  }
}

// 测试
printID(123)
printID("aaa")
  • 上面代码中, 整个if判断语句就是类型缩小, 例如当代码进入if语句第一个分支时, 一定是string类型, 进入第二个分支一定是number类型
  • if的判断语句就称为类型保护

平等缩小

我们可以使用Switch或者相等的一些运算符来表达相等性(比如=== , !== , == , and != ):

type Direction = "left" | "right" | "top" | "bottom"
function printDirection(direction: Direction) {
  // 平等类型缩小
  switch (direction) {
    case "left":
      console.log(direction)
      break
    case "right":
      console.log(direction)
      break
    case "top":
      console.log(direction)
      break
    case "bottom":
      console.log(direction)
      break
    default:
      console.log("调用默认方法")
  }
}

// 测试
printDirection("left")
printDirection("right")
printDirection("top")
printDirection("bottom")

instanceof

JavaScript 有一个运算符来检查一个值是否是另一个值的“实例”:

function printTime(time: string|Date) {
  // 判断time是否是Date的实例
  if (time instanceof Date) {
    console.log(time.toUTCString())
  } else {
    console.log(time)
  }
}

// 测试
printTime("2020-01-02")
const date = new Date()
printTime(date)

如果不好理解我们可以看下面这个例子

class Teacher {
  working() {
    console.log("正在工作")
  }
}

class Student {
  studying() {
    console.log("正在学习")
  }
}

function work(p: Student | Teacher) {
  // 判断是哪一个实例
  if (p instanceof Teacher) {
    p.working()
  } else {
    p.studying()
  }
}

// 测试
const stu = new Student()
const tec = new Teacher()

work(stu) // 正在学习
work(tec) // 正在工作

in

Javascript 有一个运算符,用于确定对象是否具有带名称的属性: in运算符

如果指定的属性在指定的对象或其原型链中,则in 运算符返回true;

// () => void表示是一个函数类型
type Dog = {running: () => void}
type Fish = {swimming: () => void}

function walk(animal: Dog|Fish) {
  // 判断函数是否在animal中
  if ("swimming" in animal) {
    animal.swimming()
  } else {
    animal.running()
  }
}

// 测试
const dog: Dog = {
  running() {
    console.log("狗是跑的")
  }
}
const fish: Fish = {
  swimming() {
    console.log("鱼是游的")
  }
}

walk(dog) // 狗是跑的
walk(fish) // 鱼是游的

总结

到此这篇关于TypeScript类型缩小的文章就介绍到这了,更多相关TypeScript类型缩小内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

TypeScript学习笔记之类型缩小

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mysql学习笔记之字段类型选择

1. 数据库的字段选择 在数据表的结构关系确定之后,这个时候就需要去确定相应的数据表的字段类型 1.1 字符串类型字段 char与varchar以及text char => char(长度) -> 多长 varchar => 根据规定长度变化 数据库中会保存v
mysql学习笔记之字段类型选择
2018-10-21

Python数据类型学习笔记

带你走进数据类型 一:整数、浮点数 Python中整数和浮点数的定义以及运算和C++都是一样的,我在这里就不需多说了,我就说明一点:Python相对于C/C++而言,定义整数没有int 和 long long 这些区分的,直接赋值即可。这就
2022-06-04

mysql学习笔记之索引类型B-TREE介绍

B-tree索引是MySQL数据库中使用最为频繁的索引类型,特别是在innodb中经常使用;在其他数据库中b-tree索引也同样是作为最主要的索引类型的,这主要是因为b-tree索引的存储结构在数据库的数据检索中有着非常优异的表现。 这种索引的特点就是会把实际
mysql学习笔记之索引类型B-TREE介绍
2022-02-03

MySQL学习笔记(4):数据类型

本文更新于2019-06-19,使用MySQL 5.7,操作系统为Deepin 15.4。目录数值类型整数类型定点数类型浮点数类型位类型日期时间类型字符串类型枚举类型集合类型数值类型整数类型type[(m)] [UNSIGNED] [ZEROFILL] [AU
MySQL学习笔记(4):数据类型
2019-09-06

Python学习笔记6——动态类型

参考博客:Python进阶09 动态类型  Python深入06 Python的内存管理 都是非常棒的文章其实这都是我前两天通过手机看的博客,感觉get到了新知识、新技能,今天早上挖的坑,因为上午有课(电子技术课程设计,嵌入式系统实验室,学
2023-01-30

Redis list 类型学习笔记与总结

redis 版本[root@localhost ~]# redis-server --version Redis server v=2.8.19 sha=00000000:0 malloc=jemalloc-3.6.0 bits=32 bu
2022-06-04

Redis String 类型和 Hash 类型学习笔记与总结

Linux 版本信息:cat /etc/issue 或cat /etc/redhat-release(Linux查看版本当前操作系统发行版信息) CentOS release 6.6 (Final)(一)String 类型 【定义】str
2022-06-04

[Python学习笔记] 数字类型及操作

数字类型整数类型十进制:1110,-123二进制:以0B或0b开头 0b110,-0B101八进制:以0O或0o开头 0o123,-0O567十六进制:以0X或0x开头 0x555,-0X89a浮点数类型可以采用科学记数法表示 5.5e-3
2023-01-31

Java学习笔记之Pattern类的用法详解

Pattern类是Java中正则表达式的主要类之一,它提供了一系列方法来操作正则表达式。正则表达式是一种用来匹配字符串的强大工具,它可以用来检查一个字符串是否符合某种模式,或者从一个字符串中提取出符合某种模式的部分。Pattern类的用法如
2023-09-02

编程热搜

目录