注意: 如果您是 TypeScript 新手,请先查看我们的 TypeScript 入门 教程。
在 TypeScript 中,never 类型表示永远不会发生的值。它通常用于表示从不返回值的函数,因为它们会抛出异常。
下面是一个 never 类型的简单示例。您可以阅读本教程的其余部分以了解更多信息。
示例
function crash(): never {
throw new Error("Something went wrong!");
}
crash();
在这里,crash() 是一个返回 never 类型值的函数。这意味着 crash() 永远不会正常完成,也无法返回值 — 甚至连 undefined 都无法返回。
TypeScript never 类型与函数
假设您有一个名为 showFatalError() 的函数,其类型为 never。
function showFatalError(): never {
throw new Error("A fatal error occurred. Please restart the app.");
}
在这里,showfatalError() 函数总是会抛出错误并且从不返回,这就是为什么它的返回类型是 never。
我们说showFatalError() 函数将完全停止程序 — 它不会返回。
如果您不小心尝试返回任何内容,TypeScript 会发出警告。例如,
function showFatalError(): never {
return; // Error: Function with return type 'never' cannot return
}
TypeScript never 与无限循环
您也可以将 never 类型与无限循环的函数一起使用。
function keepRunning(): never {
while (true) {
console.log("Still running...");
}
}
在这里,该函数会一直打印。它永远不会完成,也永远不会返回值,甚至连 undefined 都不会返回。这就是为什么返回类型是 never。
keepRunning() 函数在任何情况下都不会退出 — 它绝对不会返回任何东西。
TypeScript never 与不可达代码
您可以在不可达代码中使用 never — 如果一切正常,代码中的这些位置永远不应该被命中。
例如,您可以在 switch 语句中使用 never,在其中您已经处理了所有可能的案例。
type Status = "success" | "error";
function handleStatus(status: Status) {
switch (status) {
case "success":
console.log("Success");
break;
case "error":
console.log("Error");
break;
default:
// This is unreachable — all cases are handled above
const unreachable: never = status;
}
}
handleStatus("success");
在这里,never 用于确保 default 情况确实是不可达的。
如果有人向 Status 类型添加一个新值(例如 "loading")并且忘记在 switch 中处理它,TypeScript 将在此处抛出错误。
type Status = "success" | "error" | "loading";
function handleStatus(status: Status) {
switch (status) {
case "success":
console.log("Success");
break;
case "error":
console.log("Error");
break;
default:
// This is unreachable — all cases are handled above
const unreachable: never = status;
}
}
handleStatus("loading");
输出
error TS2322: Type '"loading"' is not assignable to type 'never'.
never 与 void 的区别
void 和 never 都用于函数不返回值的情况,但它们并不相同。
| void | never |
|---|---|
具有 void 类型的函数会完成,但不返回值。 |
具有 never 类型的函数根本不会完成。 |
| 通常与具有副作用的函数一起使用,例如将消息记录到控制台。 | 通常与抛出错误或永远运行的函数一起使用 |
另请阅读