TS查漏补缺

144 阅读1分钟

一、TypeScript 中 any、unknown、never 和 void 有什么区别?

  1. anyunknown:
    • 概念:any用于描述任意类型的变量,不作任何约束,编译时会跳过对其的类型检查。unknown表示未知类型,是ts 3.0后来引入的新类型。与any类似。
    • 区别:与any不同的是,unknown类型的变量不允许给anyunknown以外的变量赋值,也不允许执行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
  2. never
    • 概念:永不存在的值的类型,一般用于那些抛出异常或函数中执行无限循环的代码的函数返回值
    function error(msg:string):never {
        throw new Error(msg);
        // 抛出异常会直接中断程序运行,这样程序就运行不到返回值那一步了
    }
    
    function loopForever():never {
        while(true) {};
    }
    
    • 作为变量: 除了never自身,任何类型都不能赋值给 never 类型
  3. void:
    • 概念:表示无任何类型,一般用于函数如果无返回值的情况下定义返回值的类型
    function sayHello():void {
        console.log("Hello");
    }
    
    • 作为变量:声明一个void类型的变量,只能为它赋予undefinednullvoid的值