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 的人选!"

相关推荐
拆房老料41 分钟前
ONLYOFFICE也能像Microsoft Word和WPS一样分别设置中西文字体
前端·html·word·开源软件·wps
Solis程序员1 小时前
Stripe 幂等表:把「不确定的重试」变成「查表返回」
前端·安全·bootstrap·php·agent
李纲明1 小时前
WordPress 站点变慢:按 TTFB → 缓存 → 查询 → 前端 分层排查(含配置注意)
前端·缓存·性能优化·wordpress·后端开发
程序人生8881 小时前
PDF 转 Word 版式错乱、表格丢失?DocConverter Web 格式互转引擎的保真实践
前端·人工智能·opencv·机器学习·pdf·word
粥里有勺糖2 小时前
安利一下最近用的桌面“Agent” | T3 Code
前端·github·ai编程
xy34532 小时前
Axure 9.0 动态面板基本操作
前端·ui·html·axure·原型·产品设计
不停喝水3 小时前
【前端转全栈java速通课】 项目实战④7-11节 操作数据库-登录-注册-修改密码-注销-mubatis-plus简化crud-
java·前端·数据库
一水鉴天3 小时前
统一对象拓扑(UOT)设计全链定稿:从三件事分离到三继承 之1 20261010(豆包“查看聊天内容”继续)
前端·css
栖凤4 小时前
Java 的 try-catch 在 Agent 里失效了,我用了 5 个模式才兜住
java·前端·python
粥里有勺糖4 小时前
视野修炼第136期 | 前端小恐龙"Deno"被收购
前端·github·ai编程