TypeScript 中类型 any,void,unknown,never之间的区别
文章出自个人博客 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
, null
和 void
类型的值(如果 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
类型);
它能被赋值为任何类型,但不能被赋值给除了 any
和 unknown
之外的其他类型,同时,不允许执行 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": true
,never
也不能赋值给 never
);
let ne1: never;
let ne2: never;ne1 = ne2;// any 也不能分配给 never
let any1: any = 123;
ne1 = any1; // Error
TypeScript 中类型 any,void,unknown,never之间的区别相关推荐
- 解析java中方法的重载和重写之间的区别与联系
解析java中方法的重载和重写之间的区别与联系 1 不同点 1.1 方法重写是在不同的类中(父子类),方法重载是在同一类中 1.2 方法重载最初的目的是构造方法的多样化,方法重写的目的是让重写的方法满 ...
- SQL Server中唯一索引和唯一约束之间的区别
This article gives you an overview of Unique Constraints in SQL and also the Unique SQL Server index ...
- IO多路复用中select、poll、epoll之间的区别
本文来说下IO多路复用中select.poll.epoll之间的区别 文章目录 什么是IO多路复用 为什么有IO多路复用机制 同步阻塞(BIO) 同步非阻塞(NIO) IO多路复用(现在的做法) 3种 ...
- Java Persistence API中的FetchType LAZY和EAGER之间的区别?
我是Java Persistence API和Hibernate的新手. Java Persistence API中的FetchType.LAZY和FetchType.EAGER什么区别? #1楼 我 ...
- Scala中Unit、Nothing和Null之间的区别概述
在Scala中,Unit.Nothing和Null是三个比较特殊的数据类型,三者之间的区别如下: Unit 类似于Java中的void,表示没有返回值,用于不返回任何结果的方法的结果类型. 只有一个实 ...
- .NET中小数,浮点数和双精度之间的区别?
.NET中的decimal , float和double float什么区别? 有人什么时候会使用其中之一? #1楼 对我来说,这是一个有趣的话题,因为今天,我们遇到了一个讨厌的小错误,涉及到deci ...
- Hibernate中保存与持久性以及saveOrUpdate之间的区别
保存与保存或更新与持久保存在Hibernate中 save和saveOrUpdate之间的区别是什么或save和persist之间的区别是任何Hibernate面试中常见的面试问题,就像Hiberna ...
- Vue中computed、methods和watch之间的区别
对于那些开始学习Vue的人来说,对于方法.计算属性和观察者之间的区别有点混淆. 尽管通常可以使用它们中的每一个来完成或多或少相同的事情,但了解每个人在哪里胜过其他人还是很重要的. 在这个快速提示中,我 ...
- 计算机关闭和注销的区别,你可知道windows系统中注销、关机、休眠之间的区别吗...
我们在日常的使用计算机中,如果你有足够细心的话,也许你会好奇当你想关闭计算机的时候,注销.关机.睡眠这3者之间的区别是什么呢?我们在操作电脑的时候,会通过关机.注销.休眠等各种方式来让电脑停止工作.但 ...
最新文章
- 吃自助餐怎么样一个顺序吃法才合算?
- oracle索引sys_nc,通过dba_ind_columns表查到索引所在列的名字为SYS_NC00133$
- java需要会的工具_Java开发者必备的几款工具,一定要掌握!
- 苹果mac图像编辑和设计工具:Photoshop 2021
- 苏宁金融一站式API网关演进之路
- 在ubuntu系统中安装sublime
- java 登录失败 显示在页面上_用友NC系统“登陆后页面显示不完全”,怎么办?...
- php excel加密,excel工作表加密怎么设置?
- 王者荣耀英雄选择系统项目
- Exception in Thread: ValueError: signal number 32 out of range
- JS中onpropertychange事件和onchange事件区别
- Java:冒泡排序法
- softmaxsigmoid
- 【转】国内外优秀的计算机视觉团队汇总
- SVN出现黄色感叹号,红绿双箭头
- LuaBoy-Lua编辑器构想
- 二分查找【思路】【递归】
- (1分钟突击面试) 高斯牛顿、LM、Dogleg后端优化算法
- CSS中有哪些隐藏页面元素的方法?
- 面经-Bosch博世无锡amp;UL美华
热门文章
- PHP PDO 简单登陆操作
- (素材源码) 猫猫学IOS(十二)UI之UITableView学习(上)LOL英雄联盟练习
- 组策略里更改更新和设置客户端首页
- Cisco *** 完全配置指南-连载-PPTP和L2TP
- JDK源码(12)-Enum
- java调用javascript函数_使用Java程序中的参数调用Javascript函数
- 【vlan-给予mac地址认证】
- 大数据新手之路四:联合使用Flume和Kafka
- 优化Oracle网络设置的方案
- Failed to start mongod.service: Unit not found