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

相关推荐
0思必得06 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
东东5166 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino7 小时前
图片、文件的预览
前端·javascript
layman05288 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔9 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李9 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN9 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒9 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局
PHP武器库9 小时前
ULUI:不止于按钮和菜单,一个专注于“业务组件”的纯 CSS 框架
前端·css
电商API_180079052479 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫