TS从入门到精通(六)never类型与symbol类型

133 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

never

  • TypeScript never类型表示的是那些永不存在的值的类型,听起来不太好理解
  • 任何类型都不能赋值给 never 类型的变量,我们可以借助这点实现错误排查。
  • 对于死循环的函数或执行时总会抛出异常的函数来说,函数对应的返回值类型也是 never 类型
  • 因为 never 类型为底部类型,所以任意类型与 never 交叉都得到 never
       type T1 = number & never; // never
    
  • 任意类型与 never 类型联合,则不会影响原有的类型
        type T3 = number | never; // number
        type T4 = string | never; // string
    
    //返回never的函数必须存在无法达到的终点
    
    // 因为必定抛出异常,所以 error 将不会有返回值
    function error(message: string): never {
         throw new Error(message);
    }
 
    // 因为存在死循环,所以 loop 将不会有返回值
    function loop(): never {
         while (true) {
             console.log("我是大帅哥")
         }
    }
    //在编译阶段排查以外的错误
    type Foo = string | number;
    function controlFlowAnalysisWithNever(foo: Foo) {
      if (typeof foo === "string") {
        // 这里 foo 被收窄为 string 类型
      } else if (typeof foo === "number") {
        // 这里 foo 被收窄为 number 类型
      } else {
        // foo 在这里是 never
        const check: never = foo;
      }
    }

never 和 void 之间的区别

  • 没有显式返回值的函数会隐式返回 undefined。尽管我们通常说这样的函数 “什么也不返回”,但实际上它是会返回的。在这些情况下,我们通常忽略返回值。在 TypeScript 中这些函数的返回类型被推断为 void

  • 具有 never 返回类型的函数永不返回。它也不返回 undefined。该函数没有正常完成,这意味着它可能会抛出异常或根本无法退出执行。

  • never 类型为底部类型,也称为零类型或空类型。它通常表示为⊥,表示计算未将结果返回给调用方。void 类型,在另一方面,是一个单元类型(类型,它允许只有一个值),没有定义的操作

Symbol

创建全局唯一引用;只支持number string类型参数

    let sym1 = Symbol(1);
    let sym2 = Symbol("1"); 
    sym1==sym2    //false
    sym1===sym2    //false

使用symbol定义的属性,是不能通过如下方式遍历拿到的

for in Object.keys() Object.getOwnPropertyNames()

只能通过一下方法拿到

Object.getOwnPropertySymbols() Reflect.ownkeys()基本上是万能的哪怕是设置为不可枚举也可以轻松拿到