注意: 如果您是 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 类型的函数根本不会完成。 |
通常与具有副作用的函数一起使用,例如将消息记录到控制台。 | 通常与抛出错误或永远运行的函数一起使用 |
另请阅读