void 和 never 在 TypeScript 中是不同的类型:
示例:
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 才能发现这些地方,使代码更干净,避免逻辑错误。