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

相关推荐
tryCbest10 分钟前
Vue系列——第 15 篇:内置组件全家桶——Transition、Teleport、Suspense、KeepAlive
前端·vue.js
易师傅15 分钟前
技术面试已死?AI 时代,真正拉开程序员差距的是什么?
前端·后端·程序员
jay神28 分钟前
基于深度学习的交通流量预测系统(Web 版)
前端·人工智能·深度学习·yolo·计算机毕业设计
AiMan44 分钟前
别再把秘塔会话逐个点开:这可把秘塔多个会话一次导出?AI导出鸭
前端·后端·面试
AiMan44 分钟前
你好,请问可以一键导出Dola多个对话框内容吗?一键导出一整年哦
前端
Moment2 小时前
写给迷茫的应届生,怎样在 AI 时代争取更多机会
前端·后端·面试
fengci.2 小时前
CTF2MISC中等部分
开发语言·前端·学习
涛涛ing2 小时前
那个PR太干净了,干净到我差点直接点了合并
前端
去伪存真2 小时前
稠密检索负责脑补,稀疏检索负责兜底:拆解 RAG 倒排索引的“查字典”艺术
前端·agent
喵个咪3 小时前
GoWind 拆解:全链 ID 类型体系——int64 定版与前端字符串化契约
前端·后端·go