TypeScript 中的 never 类型:那些不该发生的事!

💡 TIP:你有没有见过那种函数,写出来就从没想过要"回家"?欢迎来到 never 的世界!


🎥 来点前情提要

想象一下,有个函数走进了一段死循环,然后......就没有然后了。或者它一上来就崩溃了,连个"再见"都不说。这些"神秘消失"的函数,正是 never 类型存在的意义。

在 TypeScript 这门"分析代码流"的语言里(😎 是的,TS 就喜欢搞逻辑严密),我们需要一种能够表示"永远不会有值"的类型。于是,never 横空出世!


🔥 never 的真实用例

你可以这样遇见 never

❌ 1. 永不返回的函数:

TypeScript 复制代码
function loopForever(): never {
  while (true) {}
}

这个函数永远陷在 while(true) 的地狱中,谁也救不了它。


💣 2. 总是抛出错误的函数:

TypeScript 复制代码
function crashAndBurn(): never {
  throw new Error("This function is not your friend.");
}

它上来就崩了,连执行体都没走两步。


🧪 3. 手动声明(小心别玩过头):

TypeScript 复制代码
let foo: never; // OK,但你能赋什么值呢?

foo = 123; // ❌ 报错:number 不能赋值给 never

只有 never 能赋值给 never,它是个很自闭的类型(没朋友系列)。


🎯 用武之地:类型检查中的隐藏守卫

让我们来看看 never 的一个绝妙用法:

TypeScript 复制代码
function foo(x: string | number): boolean {
  if (typeof x === 'string') {
    return true;
  } else if (typeof x === 'number') {
    return false;
  }

  // 如果到这里,说明 x 不是 string 也不是 number?
  // 理论上是不可能的情况,但我们用 fail 来告诉编译器这段是死代码。
  return fail("Unexhaustive case!");
}

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

✅ Why so clever?

  • 编译器能通过 fail 的返回类型是 never,自动推断这里是永远不会"优雅返回"的。
  • 你就可以写出完备的类型检查,特别是在处理联合类型时非常香。

😵 never vs void:傻傻分不清?

特性 void never
表示 没有返回值 永远不返回
是否有返回 有,但值为 undefined 根本不会返回
是否可赋值 可以(某些情况下) 除非是 never 本身,否则不可以
常见场景 普通函数无返回值 抛出异常、死循环、类型保护的兜底分支
TypeScript 复制代码
function doSomething(): void {
  console.log("任务完成!");
}

function explode(): never {
  throw new Error("Boom!");
}

🧠 总结:Never Say Never

never 就像是程序世界的"黑洞":一旦进入,就再也出不来了。但正因为如此,它在类型检查和安全性方面扮演着重要角色!

所以,下次当你写个函数永远不打算返回时,请自豪地告诉它:"你是 never 的人选!"

相关推荐
青莳吖1 小时前
使用 SseEmitter 实现 Spring Boot 后端的流式传输和前端的数据接收
前端·spring boot·后端
CodeCraft Studio2 小时前
PDF处理控件Aspose.PDF教程:在 C# 中更改 PDF 页面大小
前端·pdf·c#
拉不动的猪2 小时前
TS常规面试题1
前端·javascript·面试
再学一点就睡2 小时前
实用为王!前端日常工具清单(调试 / 开发 / 协作工具全梳理)
前端·资讯·如何当个好爸爸
Jadon_z3 小时前
vue2 项目中 npm run dev 运行98% after emitting CopyPlugin 卡死
前端·npm
一心赚狗粮的宇叔3 小时前
web全栈开发学习-01html基础
前端·javascript·学习·html·web
IT瘾君3 小时前
JavaWeb:前端工程化-ElementPlus
前端·elementui·node.js·vue
爱编程的鱼3 小时前
如何在 HTML 中添加按钮
前端·javascript·html
鱼与宇3 小时前
WebSphere(WAS)
前端·chrome
站在风口的猪11083 小时前
《前端面试题:前端布局全面解析(圣杯布局、双飞翼布局等)》
前端·css·html·css3·html5