文章出自个人博客 https://knightyun.github.io/2021/04/03/js-ts-type-compare,转载请申明


TypeScript 拓展了 JavaScript 的基本类型与语言特性,为了覆盖类型检查的情景,衍生出了一些额外的类型,其中 any, unknown, void, never 这几个类型所适用的情形容易使人混淆,下面通过举例进行一下区分;

any

这应该是 typescript 中最开始就会接触到的类型,顾名思义:任意类型,这也是 ts 中不写类型申明时的默认类型,即不作任何约束,编译时会跳过对其的类型检查,

let val1: any;
val1 = 'abc';
val1 = 123;
val1 = true;const arry: any[] = [123, 'abc', true, null];

void

void 表示无任何类型,正好与 any 相反,没有类型,如果是函数则应没有返回值或者返回 undefined,和 C 等语言中的无返回值函数申明类似:

function voidFn(): void {}
function voidFn1(): void { return undefined; }
function voidFn2(): void { return; }function voidFn3(): void { return 1; } // Error

变量也可以申明为 void 类型,只不过只能给这个变量分配 undefined, nullvoid 类型的值(如果 ts 配置文件中设置了 "strictNullChecks": false,那么分配 null 类型的值也会报错):

let val1: void;
let val2: null = null;
let val3: undefined = undefined;
let val4: void;val1 = val2; // "strictNullChecks": false 时报错
val1 = val3;
val1 = val4;

unknown

顾名思义,unknown 表示未知类型,是 typescript 3.0 中引入的新类型,即写代码的时候还不清楚会得到怎样的数据类型,如服务器接口返回的数据,JSON.parse() 返回的结果等;该类型相当于 any,可以理解为官网指定的替代 any 类型的安全版本(因为不提倡直接使用 any 类型);

它能被赋值为任何类型,但不能被赋值给除了 anyunknown 之外的其他类型,同时,不允许执行 unknown 类型变量的方法(any 可以),举个例子:

let uk: unknown = 'abc';uk = 123;
uk = true;
uk.toString(); // Errorlet valAny: any = 'abc';
valAny.toString(); // 'abc'let uk1: unknown = uk;
let uk2: any = uk;
let uk2: string = uk; // Error

never

never 同样顾名思义,表示永不存在的值的类型,是 typescript 2.0 中引入的新类型,概念有点绕,什么情况下变量会永远不存在值呢?因为通常情况下,变量一旦申明了,就会被分配值,即使没有特别指定,也会被初始化为 undefined,同样一个函数即使有个写返回值,也会默认返回 undefined,也不是真正的不存在返回值:

let foo;
console.log(typeof foo); // 'undefined'function bar() {};
console.log(typeof bar()); // 'undefined'

其实确实有一些情形,值会永不存在,比如,从程序运行的维度讲,如果一个函数执行时抛出了异常,那么这个函数变永远不会有值了(因为抛出异常会直接中断程序运行,这样程序就运行不到返回值那一步了,即具有不可达的终点,也就永不存在返回了):

function err(msg: string): never {throw new Error(msg);
}// 有机会到达终点的函数也算存在返回值,编译会报错
function err1(): never { // Errorif (Math.random() > 0.5) {throw new Error('message');}
}

还有一种极端情况也比较类似,就是函数中执行无限循环的代码(死循环),这样也同样使得程序永远无法运行到函数返回值那一步,永不存在返回:

function loopForever(): never {while (true) {};
}

变量也可以直接申明为 never 类型,让它永不存在值,其实就是意思就是永远不能给它赋值,否则就会报错,这样就可以形成一种保护机制;

let ne: never;ne = 123; // Error

另外,never 是所有类型的子类型,意思就是它可以赋值给任何类型(前提是配置里 "strictNullChecks": false,否则检查不通过);

let num: number = 123;
let ne: never;num = ne;

同时也没有任何类型是 never 的子类型,除了 never 自身,即除了 never 任何类型都不能赋值给 never 类型的变量(如果前提是 "strictNullChecks": truenever 也不能赋值给 never);

let ne1: never;
let ne2: never;ne1 = ne2;// any 也不能分配给 never
let any1: any = 123;
ne1 = any1; // Error

TypeScript 中类型 any,void,unknown,never之间的区别相关推荐

  1. 解析java中方法的重载和重写之间的区别与联系

    解析java中方法的重载和重写之间的区别与联系 1 不同点 1.1 方法重写是在不同的类中(父子类),方法重载是在同一类中 1.2 方法重载最初的目的是构造方法的多样化,方法重写的目的是让重写的方法满 ...

  2. SQL Server中唯一索引和唯一约束之间的区别

    This article gives you an overview of Unique Constraints in SQL and also the Unique SQL Server index ...

  3. IO多路复用中select、poll、epoll之间的区别

    本文来说下IO多路复用中select.poll.epoll之间的区别 文章目录 什么是IO多路复用 为什么有IO多路复用机制 同步阻塞(BIO) 同步非阻塞(NIO) IO多路复用(现在的做法) 3种 ...

  4. Java Persistence API中的FetchType LAZY和EAGER之间的区别?

    我是Java Persistence API和Hibernate的新手. Java Persistence API中的FetchType.LAZY和FetchType.EAGER什么区别? #1楼 我 ...

  5. Scala中Unit、Nothing和Null之间的区别概述

    在Scala中,Unit.Nothing和Null是三个比较特殊的数据类型,三者之间的区别如下: Unit 类似于Java中的void,表示没有返回值,用于不返回任何结果的方法的结果类型. 只有一个实 ...

  6. .NET中小数,浮点数和双精度之间的区别?

    .NET中的decimal , float和double float什么区别? 有人什么时候会使用其中之一? #1楼 对我来说,这是一个有趣的话题,因为今天,我们遇到了一个讨厌的小错误,涉及到deci ...

  7. Hibernate中保存与持久性以及saveOrUpdate之间的区别

    保存与保存或更新与持久保存在Hibernate中 save和saveOrUpdate之间的区别是什么或save和persist之间的区别是任何Hibernate面试中常见的面试问题,就像Hiberna ...

  8. Vue中computed、methods和watch之间的区别

    对于那些开始学习Vue的人来说,对于方法.计算属性和观察者之间的区别有点混淆. 尽管通常可以使用它们中的每一个来完成或多或少相同的事情,但了解每个人在哪里胜过其他人还是很重要的. 在这个快速提示中,我 ...

  9. 计算机关闭和注销的区别,你可知道windows系统中注销、关机、休眠之间的区别吗...

    我们在日常的使用计算机中,如果你有足够细心的话,也许你会好奇当你想关闭计算机的时候,注销.关机.睡眠这3者之间的区别是什么呢?我们在操作电脑的时候,会通过关机.注销.休眠等各种方式来让电脑停止工作.但 ...

最新文章

  1. 吃自助餐怎么样一个顺序吃法才合算?
  2. oracle索引sys_nc,通过dba_ind_columns表查到索引所在列的名字为SYS_NC00133$
  3. java需要会的工具_Java开发者必备的几款工具,一定要掌握!
  4. 苹果mac图像编辑和设计工具:Photoshop 2021
  5. 苏宁金融一站式API网关演进之路
  6. 在ubuntu系统中安装sublime
  7. java 登录失败 显示在页面上_用友NC系统“登陆后页面显示不完全”,怎么办?...
  8. php excel加密,excel工作表加密怎么设置?
  9. 王者荣耀英雄选择系统项目
  10. Exception in Thread: ValueError: signal number 32 out of range
  11. JS中onpropertychange事件和onchange事件区别
  12. Java:冒泡排序法
  13. softmaxsigmoid
  14. 【转】国内外优秀的计算机视觉团队汇总
  15. SVN出现黄色感叹号,红绿双箭头
  16. LuaBoy-Lua编辑器构想
  17. 二分查找【思路】【递归】
  18. (1分钟突击面试) 高斯牛顿、LM、Dogleg后端优化算法
  19. CSS中有哪些隐藏页面元素的方法?
  20. 面经-Bosch博世无锡amp;UL美华

热门文章

  1. PHP PDO 简单登陆操作
  2. (素材源码) 猫猫学IOS(十二)UI之UITableView学习(上)LOL英雄联盟练习
  3. 组策略里更改更新和设置客户端首页
  4. Cisco *** 完全配置指南-连载-PPTP和L2TP
  5. JDK源码(12)-Enum
  6. java调用javascript函数_使用Java程序中的参数调用Javascript函数
  7. 【vlan-给予mac地址认证】
  8. 大数据新手之路四:联合使用Flume和Kafka
  9. 优化Oracle网络设置的方案
  10. Failed to start mongod.service: Unit not found