ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

The Concise TypeScript Book:深入理解 `never` 类型与穷尽性检查

The Concise TypeScript Book:深入理解 `never` 类型与穷尽性检查 文档教程【免费下载链接】typescript-bookThe Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.项目地址https://gitcode.com/gh_mirrors/typ/typescript-book点击查看免费下载导读never是 TypeScript 类型系统中一个容易误解却极具价值的内置类型它表示永远不会发生的值。在 The Concise TypeScript Book 中never被用于标注永不返回的函数如无限循环、抛错函数并配合控制流分析实现穷尽性检查exhaustiveness checking让编译器在新增联合类型成员时立即报错。读完本文你将掌握never的定义、三处典型用法、它与void/unknown的区分以及如何用它守住联合类型的最后一公里。一、never是什么永不出现的值根据原文档定义never类型代表永远不会出现的值values that never occur。它被用来标注永不返回或必然抛出错误的函数与表达式。把它放到类型系统集合论视角下看会更直观。仓库中的 exploring-the-type-system.md 将每种类型看作一个集合并给出对应表集合术语TypeScript说明空集Empty setnevernever中不包含除它自身之外的任何值单元素集undefined/null/ 字面量类型例如type X X有限集boolean/ 联合类型如up \| down无限集string/number/object全集Universal setany/unknownany包含每个元素unknown是any的类型安全版因此从集合视角看never就是空集 ∅没有任何值属于never反过来它也永远装不下任何值。这正是下面所有行为不可赋值、穷尽性检查的根基。二、三种典型用法永不返回、抛错与不可达分支2.1 标注永不返回的函数无限循环原文档给出的第一个示例是用never标注永不返回的无限循环函数const infiniteLoop (): never { while (true) { // do something } };由于while (true)永远不会结束函数不可能正常返回因此返回类型不能是voidvoid表示没有返回值但会返回而必须是never。2.2 标注必然抛错的函数第二个示例是抛出错误的函数const throwError (message: string): never { throw new Error(message); };throw语句会中断控制流函数同样永不返回所以返回类型标注为never是准确的。这也是 built-in-type-primitives.md 中对never的官方描述Typically used as the return type of functions that throw an error or enter an infinite loop典型用于抛错或进入无限循环的函数返回类型。2.3 类型收窄后的不可达分支在 the-never-type.md 中仓库展示了另一个重要场景当变量被收窄narrowing到不可能再有任何值时编译器会把它推断为neverconst printValue (val: string | number) { if (typeof val string) { console.log(val.toUpperCase()); } else if (typeof val number) { console.log(val.toFixed(2)); } else { // val 在这里的类型是 never // 因为除了 string 或 number它不可能是其他任何值 const neverVal: never val; console.log(Unexpected value: ${neverVal}); } };这是类型收窄narrowing与 control-flow-analysis.md 共同作用的结果控制流分析会沿着if/else if/else逐步缩小变量的类型域当所有可能分支都被覆盖后else分支里的变量类型域成为空集编译器便将其推断为never。三、穷尽性检查让联合类型增员即报错never最有实战价值的用法是配合switch语句实现穷尽性检查exhaustiveness checking。仓库的 exhaustiveness-checking.md 给出了标准范式type Direction up | down; const move (direction: Direction) { switch (direction) { case up: console.log(Moving up); break; case down: console.log(Moving down); break; default: const exhaustiveCheck: never direction; console.log(exhaustiveCheck); // 这一行永远不会被执行 } };这段代码的价值在于可维护性如果未来有人给Direction增加一个新成员例如left而switch中没有对应case那么default分支里direction的类型就不再是never而是left。此时const exhaustiveCheck: never direction这行赋值会触发编译错误——Type left is not assignable to type never——从而在编译期就提醒开发者补全新分支。这与原文档 never-type.md 中的示例一致其default分支同样借助const exhaustiveCheck: never direction;来兜底二者共同构成了本书对穷尽性检查的完整讲解。四、区分易混淆类型nevervsvoidvsunknown理解never需要把它和相近类型区分开类型含义典型场景never空集值永不出现无限循环、抛错函数、穷尽性检查void没有返回值但函数会正常返回事件处理器、无返回值的函数unknown任意值但使用前必须收窄外部输入、JSON 解析结果any任意值放弃类型检查迁移期兜底不推荐关于赋值方向的细节exploring-the-type-system.md 给出了关键事实let f: never; f 1; // Invalid没有任何东西可以赋给 never即一切类型都可以赋给any/unknown但没有任何值可以赋给nevernever只可赋给它自身与any。同时仓库提醒启用strictNullChecks后null与undefined的行为类似于void未启用时它们的行为则类似于never。五、延伸阅读never是本书类型系统章节体系的一部分建议按以下顺序结合阅读类型收窄Narrowingtypeof、真值判断、switch、in、instanceof等收窄手段是never推断的前提控制流分析Control Flow Analysis理解编译器如何沿分支收窄类型、推断never穷尽性检查Exhaustiveness Checkingnever在default分支中的标准用法联合类型Union Typenever常与联合类型搭配构成可穷尽的分支集合探索类型系统Exploring the Type System以集合论视角理解never作为空集的性质。小结never虽然装不下任何值却在 TypeScript 的类型安全体系中扮演关键角色它精确标注永不返回的函数揭示不可达分支并通过穷尽性检查把漏掉分支从运行时 bug 变成编译期错误。掌握never你就能为联合类型筑牢最后一道防线。赞分享文档教程【免费下载链接】typescript-bookThe Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.项目地址https://gitcode.com/gh_mirrors/typ/typescript-book点击查看免费下载相关推荐The Concise TypeScript Book 精读深入理解 never 类型与穷尽性检查The Concise TypeScript Book 精读深入理解 never 类型与穷尽性检查 never 类型是 TypeScript 类型系统中一个看文档教程The Concise TypeScript Book 精讲深入理解 never 类型与穷尽性检查实战The Concise TypeScript Book 精讲深入理解 never 类型与穷尽性检查实战 never 是 TypeScript 内置类型中最特殊文档教程The Concise TypeScript Book 中的 never 类型从空集合收窄到穷尽性检查The Concise TypeScript Book 中的 never 类型从空集合收窄到穷尽性检查 本篇围绕 The Concise TypeScript文档教程上一篇抖音批量下载神器一键获取无水印高清视频告别繁琐操作下一篇WAS Node Suite Load Image Batch节点架构解析状态管理与批量处理系统的实现原理与性能调优创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表