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

相关推荐
dy17172 小时前
element-plus表格默认展开有子的数据
前端·javascript·vue.js
2501_915918415 小时前
Web 前端可视化开发工具对比 低代码平台、可视化搭建工具、前端可视化编辑器与在线可视化开发环境的实战分析
前端·低代码·ios·小程序·uni-app·编辑器·iphone
程序员的世界你不懂6 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
索迪迈科技6 小时前
网络请求库——Axios库深度解析
前端·网络·vue.js·北京百思可瑞教育·百思可瑞教育
gnip6 小时前
JavaScript二叉树相关概念
前端
attitude.x7 小时前
PyTorch 动态图的灵活性与实用技巧
前端·人工智能·深度学习
β添砖java7 小时前
CSS3核心技术
前端·css·css3
空山新雨(大队长)7 小时前
HTML第八课:HTML4和HTML5的区别
前端·html·html5
猫头虎-前端技术8 小时前
浏览器兼容性问题全解:CSS 前缀、Grid/Flex 布局兼容方案与跨浏览器调试技巧
前端·css·node.js·bootstrap·ecmascript·css3·媒体