TypeScript never 类型

注意: 如果您是 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 的区别

voidnever 都用于函数不返回值的情况,但它们并不相同。

void never
具有 void 类型的函数会完成,但不返回值。 具有 never 类型的函数根本不会完成。
通常与具有副作用的函数一起使用,例如将消息记录到控制台。 通常与抛出错误或永远运行的函数一起使用

另请阅读

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战