有关 typescript 中 never 类型的理解

70 阅读1分钟

never 通常表示一个不可能发生的值或一个永远不会返回的函数。never 类型通常与异常、无限循环或其他类似情况相关。

以下是一些常见的情况,never 类型可能会被用到:

  1. 抛出异常:

    function throwError(message: string): never {
      throw new Error(message);
    }
    

    这里的 never 表示该函数永远不会正常返回,而是抛出一个异常。

  2. 无限循环:

    function infiniteLoop(): never {
      while (true) {
        // 无限循环,永远不会结束
      }
    }
    

    类似地,由于循环永远不会结束,该函数的返回类型是 never

  3. 类型保护: 在某些条件下,你可能能够使用类型保护,以便 TypeScript 知道某些值的类型是 never

    function assertNever(value: never): never {
      throw new Error(`Unexpected value: ${value}`);
    }
    
    function processValue(value: string | number) {
      if (typeof value === 'string') {
        // 在这个分支中,value 的类型被收窄为 string
      } else if (typeof value === 'number') {
        // 在这个分支中,value 的类型被收窄为 number
      } else {
        // 这里的 value 应该是 never 类型
        assertNever(value);
      }
    }
    

    在最后一个分支中,assertNever 函数用于告诉 TypeScript 编译器,此处的 value 应该是 never 类型。

总的来说,never 类型用于表示那些永远不会出现的值或函数的返回类型。这在某些情况下有助于更好地描述代码的行为,并让 TypeScript 编译器能够进行更严格的类型检查。