never never 类型
最后更新:2026-10-22
never never 类型
never 表示"永远不会有值":抛错或死循环的函数返回它;在类型层它是所有类型的子类型,最出名的用法是 switch 穷尽检查。
| 分组 | 基础类型 |
|---|---|
| 类型 | 类型 |
| 严格模式 | 不需要 |
ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。
📝 语法
function fail(msg: string): never {
throw new Error(msg);
}
// 穷尽检查:default 分支把漏掉的 case 变成编译错误
type Shape = Circle | Square;
⚙️ 参数
| (): never | 只允许 throw、死循环或调用另一个 never 函数——正常 return 会报错 |
|---|
返回值:never 本身就是"返回类型":表示函数永远不会正常返回(抛错、终止进程或死循环)。
▶ 示例
修改下面的代码,点击试一试查看转译运行结果:
输出:
caught: disk full
(转译后运行输出;在 fail 里写 return 1 会得到编译错误——never 函数不能正常返回)
💡 要点
ℹ️ 说明 never 是所有类型的子类型,但没有任何值能赋给 never——连 any 都不行,它是"空集"类型。
💡 提示 穷尽检查套路:switch 的 default 里写 const _exhaustive: never = value。新增联合分支而忘记处理时,这里立刻编译报错(见 exhaustive-checks)。
⚠️ 注意 never 与 void 都"不返回东西",含义完全不同:void 是正常结束但没有返回值,never 是根本不会正常结束。
🏷️ 相关基础类型
💡 相关案例
更多案例即将上线。
📚 相关教程
❓ 常见问题
Q never 和 void 的区别?
A void:函数正常执行完毕,只是没有返回值(如日志)。never:函数根本不会正常返回(抛错/死循环),或类型上不存在值。
Q never 有什么实际用途?
A 两大用途:标注抛错/终止函数;穷尽检查——在 switch default 里把收窄成 never 的联合值赋给 never 变量,漏分支即编译报错。条件类型里也用 never 过滤成员。
Q 为什么我的变量类型变成了 never?
A 通常是收窄过头:比如判断了所有可能分支后剩余类型为空,或对不可达代码做了操作。检查控制流分析给出的剩余类型,往往是某分支条件写重了。