文章目录

  • 类型缩小
    • typeof
    • 平等缩小
    • instanceof
    • in

类型缩小

什么是类型缩小呢?

类型缩小的英文是 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)breakcase "right":console.log(direction)breakcase "top":console.log(direction)breakcase "bottom":console.log(direction)breakdefault: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】的类型缩小相关推荐

  1. 快速而深入地了解TypeScript及其类型

    by David Piepgrass 由David Piepgrass 快速而深入地了解TypeScript及其类型 (A quick yet in-depth tour of TypeScript ...

  2. 简单探讨TypeScript 枚举类型

    这篇文章主要介绍了TypeScript 枚举类型,TypeScript 在 ES 原有类型基础上加入枚举类型,使得在 TypeScript 中也可以给一组数值赋予名字,这样对开发者比较友好,可以理解枚 ...

  3. TypeScript 基础类型 1

    TypeScript 基础类型 自本节起,我们将开始接触 TypeScript 的类型系统,这也是 TypeScript 最为核心的部分. 本节介绍 TypeScript 中一些基础类型,有些特殊类型 ...

  4. TypeScript 基础类型+函数+接口+类

    1.简介: TypeScript 是 JavaScript 的一个超集.由微软开发的自由和开源的编程语言.设计目标是开发大型应用.是一种面向对象的编程语言,遵循强类型 javascript与types ...

  5. PART16 TypeScript高级类型

    文章目录 TypeScript高级类型 class类 构造函数 实例方法 类的继承 类成员的可见性 类型兼容性 接口之间的兼容性 函数之间的兼容性 参数个数 参数类型 返回值类型 交叉类型 泛型 泛型 ...

  6. TypeScript高级类型:联合类型、交叉类型和类型别名

    目录 引言 联合类型 交叉类型 类型别名 注意 结论 引言 TypeScript 是一门强类型语言,其高级类型功能使得开发者能够更加灵活地定义类型并对其进行操作,以便于更好地编写可维护和可扩展的代码. ...

  7. 03 ts类型缩小,函数

    目录 类型缩小 函数类型 函数类型参数的个数 函数调用签名 函数构造签名(理解) 函数参数可选类型 参数默认值 剩余参数 函数的重载(了解) 联合类型与重载 函数中this的默认推导 不明确this类 ...

  8. typescript索引类型_TypeScript类型声明书写详解

    本文总结一下TypeScript类型声明的书写,很多时候写TypeScript不是问题,写类型就特别纠结,我总结下,我在使用TypeScript中遇到的问题.如果你遇到类型声明不会写的时候,多看看lo ...

  9. Typescript 基本类型

    基础知识脑补下 在 JavaScript 的类型分为两种: 原始数据类型(Primitive data types) 对象类型(Object types) 其中,原始数据类型包括:布尔值.数字.字符串 ...

最新文章

  1. 爬虫之JS的解析确定js的位置
  2. linux目录加了一把锁怎么办,linux 文件加锁 lockf 小结
  3. [置顶] 正则表达式应用:匹配IP地址
  4. 助力企业利润快跑的下一只轮子——移动应用?【创新时代】
  5. python英语字典程序修改_详解如何修改python中字典的键和值
  6. Vue (二) --- Vue对象提供的属性功能
  7. 【4.0】jdbcTemplate
  8. Android 开源优秀 Library 推荐
  9. java如何禁用usb_IT技巧分享59: 如何禁用USB端口以及光驱来保证数据不被泄露
  10. java iso-8859-1_如何在Java中的ISO-8859-1和UTF-8之间转换?
  11. 初学Python之谈
  12. equals()重写之后为什么要重写hashCode()方法
  13. JavaScript中this关键字的使用比较
  14. 《Effective Ruby:改善Ruby程序的48条建议》一第6条:了解Ruby如何构建继承体系
  15. LaTex中 viso及svg转emf
  16. 学计算机的怎样分析TCGA数据库,TCGA一些数据库
  17. 单片机函数:_crol_和_cror_
  18. Hello CTP(一)——期货业务
  19. 燃油经济性加速时间曲线matlab,汽车理论课后习题Matlab程序详解
  20. 全网最详细官网一键换肤教程

热门文章

  1. 【Web前端面试】葵花宝典(2022版本)—— CSS篇
  2. VVC/H.266代码阅读(VTM8.0)(三. Slice到CTU的处理 )
  3. 神经网络理论及其应用,神经网络的原理和应用
  4. [pytorch] PyTorch Metric Learning库代码学习二 Inference
  5. 昆仑通态复制的程序可以用吗_免费!最全MCGS昆仑通态视频合集!
  6. GIS领域的一些机器学习和人工智能的案例
  7. 【Linux】软件包管理器 yum 与编辑器 vim 的基本使用
  8. bpython缺少termios_asciinema缺少文件:ImportError:没有名为“termios”的模块
  9. 项目经理必须具备的十大管理技能
  10. 模拟21cn邮箱登陆,获取邮件