600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > TypeScript 中类型 any void unknown never之间的区别

TypeScript 中类型 any void unknown never之间的区别

时间:2023-09-16 04:19:54

相关推荐

TypeScript 中类型 any void unknown never之间的区别

文章出自个人博客 https://knightyun.github.io//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 也不能分配给 neverlet any1: any = 123;ne1 = any1; // Error

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。