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