什么是 TypeScript 的 never 类型?

2024-08-26 15:44:02 467
`never` 类型是 TypeScript 中的一种特殊类型,用来表示那些永远不会发生的值。`never` 通常用于以下几种场景:
  1. 函数永远不返回值(如抛出异常或无限循环)。
  2. 不可能的类型,当类型系统通过联合类型进行类型缩小时,never 可以表示不可能发生的情况。

1. never 用于永不返回的函数

当一个函数永远不会成功返回(如抛出异常或进入无限循环),它的返回类型就是 never

示例 1: 抛出异常的函数

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

throwError("This is an error!"); // 函数抛出异常,永远不会返回

解释:

  • throwError 函数抛出了一个异常,所以它永远不会正常返回。因此,其返回类型是 never

示例 2: 无限循环的函数

function infiniteLoop(): never {
    while (true) {
        console.log("This will run forever");
    }
}

infiniteLoop(); // 函数进入无限循环,永远不会返回

解释:

  • infiniteLoop 函数进入了一个无限循环,因此它永远不会结束或返回任何值,所以返回类型是 never

2. never 用于不可能的类型

在联合类型中,当通过类型缩小操作移除所有可能的类型时,剩下的类型就是 never。这通常用于类型检查的严格性。

示例 3: 类型缩小中的 never

type Shape = 'circle' | 'square';

function getArea(shape: Shape): number {
    if (shape === 'circle') {
        return Math.PI * 1 * 1; // 假设圆的半径为1
    } else if (shape === 'square') {
        return 1 * 1; // 假设正方形的边长为1
    } else {
        const _exhaustiveCheck: never = shape;
        throw new Error(`Unknown shape: ${_exhaustiveCheck}`);
    }
}

解释:

  • getArea 函数处理 Shape 类型的参数,它可以是 'circle''square'
  • else 分支中的代码实际上永远不会执行,因为 shape 只能是 'circle''square'。因此,_exhaustiveCheck 变量的类型会被推断为 never,确保函数已经处理了所有可能的类型。
  • 如果将来 Shape 类型新增了其他值(如 'triangle'),而 getArea 函数没有相应的处理逻辑,这段代码会在编译时报错,提醒开发者未处理新的情况。

总结

  • never 类型表示永远不会存在的值,常用于函数永远不会返回或类型缩小到不可能的情况。
  • 它在确保代码的类型安全性和完整性方面起到了重要作用,通过类型检查捕获潜在的错误和遗漏。