一、TypeScript 中 any、unknown、never 和 void 有什么区别?
any和unknown:- 概念:
any用于描述任意类型的变量,不作任何约束,编译时会跳过对其的类型检查。unknown表示未知类型,是ts 3.0后来引入的新类型。与any类似。 - 区别:与
any不同的是,unknown类型的变量不允许给any或unknown以外的变量赋值,也不允许执行unknown类型变量的方法。
let notSure: unknown = 'Hello'; // 可以被赋值任意类型 let notSure1: unknown = true; let any1: any = 12; // 可以被赋值任意类型 let num: number = 12; num = any1; notSure = notSure1; // 'unknown' assignable to 'unknown' notSure = any1; // 'any' assignable to 'unknown' num = notSure; // 'unknown' NOT assignable to 'number' notSure.toLowerCase(); // method 'toLowerCase' does not exist on type 'unknown'- 解决问题:这种限制有很强的防御性,但如果我们要对未知类型执行某些操作,有以下方法:
方式一: 使用断言
(notSure as string).toLowerCase()
方式二:使用类型守卫进行类型收缩if(typeof notSure === 'string') (notSure as string).toLowerCase() // 或者使用instanceof
- 概念:
never- 概念:永不存在的值的类型,一般用于那些抛出异常或函数中执行无限循环的代码的函数返回值。
function error(msg:string):never { throw new Error(msg); // 抛出异常会直接中断程序运行,这样程序就运行不到返回值那一步了 } function loopForever():never { while(true) {}; }- 作为变量: 除了
never自身,任何类型都不能赋值给never类型
void:- 概念:表示无任何类型,一般用于函数如果无返回值的情况下定义返回值的类型
function sayHello():void { console.log("Hello"); }-
作为变量:声明一个
void类型的变量,只能为它赋予undefined、null和void的值