编程全栈开发工程师

解释 TypeScript 中 never 和 void 类型之间的区别。何时以及为何要使用它们?

用 Hintsage AI 助手通过面试

答案。

voidnever 在 TypeScript 中是不同的类型:

  • void 通常用作不返回任何值的函数的返回类型,即函数完成执行但不返回值。
  • never 表示函数(或表达式)永远不会成功结束:要么始终抛出异常,要么永远不返回控制权(例如,无限循环)。

示例:

function log(message: string): void { console.log(message); } function throwError(message: string): never { throw new Error(message); } function infinite(): never { while (true) {} }

never 常用于按类型控制 switch-case 的完整性:

type Shape = { kind: 'circle' } | { kind: 'square' }; function getArea(shape: Shape) { switch (shape.kind) { case 'circle': return 1; case 'square': return 2; default: const _exhaustive: never = shape; // 如果遗漏了 case,编译器会给出提示 } } }

隐藏的问题。

void 和 never 是否可以互换使用作为函数的返回类型?

回答: 不可以。带有 void 类型的函数返回 undefined 或者不返回任何值,但完成执行。带有 never 类型的函数永远不会成功结束执行(抛出错误或进入无限循环)。

示例:

const fn: () => never = () => { // return; // 错误:声明类型为 'never' 的函数不得返回。 };

历史

在分析系统中,验证器函数被类型化为返回 void,尽管它总是抛出异常。因此,开发人员认为该函数可以“返回”,没有进行进一步检查,导致错误处理被遗漏并且调用链实现不正确。


历史

在一个项目中,TypeScript 函数期望明确类型的返回类型,定义为返回 never ,而不是 void。因此,尝试调用带有被类型化为 never 的回调函数时,导致编译错误和 API 兼容性丧失。


历史

在后端模块中,之前通过返回类型为 void 的函数抛出异常。迁移到 TypeScript 后,编译器没有警告在调用该函数后代码超出范围,导致额外的“不可达”代码行——只有将返回类型更改为 never 才能发现这些地方,使代码更干净,避免逻辑错误。