首页/新闻资讯/正文详情

The Concise TypeScript Book:深入解析 TypeScript 字面量类型(Literal Types)——从单元素集合到可辨识联合

发布时间:2026/9/26 2:58:14 来源:云帆数科 栏目:资讯中心
The Concise TypeScript Book:深入解析 TypeScript 字面量类型(Literal Types)——从单元素集合到可辨识联合
文档教程【免费下载链接】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点击查看免费下载字面量类型Literal Types是 TypeScript 类型系统中最精确的一类类型它把某个具体的 JavaScript 原始值一个字符串、一个数字或一个布尔值本身上升为一种类型。本篇指南以 The Concise TypeScript Book 意大利语版的 Tipi letterali 章节为主体结合仓库中 字面量推断、联合类型、类型收窄、可辨识联合、穷尽性检查、模板联合类型 与 类型系统探索 等章节深入展开。读完你将掌握字面量类型的定义、推断规则以及如何用它构建类型安全的联合类型、可辨识联合、穷尽性检查等实战模式。什么是字面量类型类型即集合视角下的单元素集合在 The Concise TypeScript Book 中字面量类型的定义非常精炼一个字面量类型是集合类型collective type内部的单元素集合single-element set它定义了一个非常精确的值而这个值就是一个 JavaScript 原始值。这句话背后是 TypeScript 的类型即集合思想。仓库的 Esplorazione del sistema di tipi 章节中明确写道在 TypeScript 中一个类型是可能值的集合该集合也被称为类型的域domain。类型中的每个值都可以看作集合中的一个元素。该章节还给出了一张集合论术语与 TypeScript 类型的对照表集合术语TypeScript说明空集nevernever中不包含任何值单元素集合undefined/null/字面量类型恰好只有一个值有限集合boolean/ 联合类型有限个值无限集合string/number/object无穷多个值全集any/unknown每个元素都是any的成员由此可见string是所有字符串组成的无限集合而a字面量类型是恰好只有a这一个字符串的单元素集合。字面量类型把类型从宽泛的分类收敛到精确的常量这正是它被用于约束取值范围的根基。三种字面量类型字符串、数字、布尔TypeScript 中的字面量类型只有三类全部对应 JavaScript 原始值字符串字面量类型String Literal Types如a数字字面量类型Numeric Literal Types如1布尔字面量类型Boolean Literal Types如true原文档给出的基础示例const a a; // 字符串字面量类型 const b 1; // 数字字面量类型 const c true; // 布尔字面量类型注意上例中三个变量都用const声明因此它们的类型会被推断为精确的字面量类型a、1、true而不是宽泛的string、number、boolean。这正是下一节字面量推断要讲的核心规则。字面量推断为什么const与let推断结果不同字面量类型与类型推断Inference紧密相关。仓库的 Inferenza letterale 章节解释了 TypeScript 的关键推断行为字面量推断Literal Inference是 TypeScript 的一项特性它允许根据变量的值推断出变量的类型。const x x; // 字面量类型 x因为这个值此后无法改变 let y y; // 类型 string因为我们可以随时修改这个值推断规则const声明的变量不可重新赋值所以 TypeScript 敢于把类型收窄为精确的字面量类型而let声明的变量随时可被改成其他字符串所以会被拓宽widening为string。一个更隐蔽的陷阱出现在对象属性上即使属性值看起来是字面量TypeScript 默认也认为它可以被后续修改因此推断为宽泛类型type X a | b; let o { x: a, // 这是宽泛的 string而不是字面量 a }; const fn (x: X) ${x}-foo; console.log(fn(o.x)); // 报错类型 string 不能赋给参数类型 X由于o.x被推断为string而非字面量a把它传给只接受X的函数时 TypeScript 会报错——X是比string更窄narrower的类型。解决方式有两种都是类型断言type assertionlet o { x: a as const, // 断言为字面量 a };let o { x: a as X, // 断言为联合类型成员 a };除了as const与as X这类局部断言仓库 Esplorazione del sistema di tipi 章节还介绍了整体断言as const以及 TypeScript 5.0 起在泛型参数上使用const修饰符来保留字面量精度我们会在后文展开。组合字面量联合类型与类型别名单独的字面量类型价值有限它们的真正威力在于组合成联合类型Union Types。仓库的 Union Type 章节定义联合类型是表示一个值可以是若干类型之一的类型用|符号连接每种可能的类型。let x: string | number; x hello; // 合法 x 123; // 合法当字面量类型通过|组合时就得到一个取值白名单。原文档的核心示例type O a | b | c;O只包含a、b、c这三个明确指定的字符串任何其他字符串都不合法。用集合论的视角看见 类型系统探索 的Tipi come insiemi小节a | b | c就是三个单元素集合的并集T1 ∪ T2而T1 extends T2相当于T1 是 T2 的子集。这种字面量联合是 TypeScript 表达有限状态集合最自然的方式比纯字符串类型安全得多编辑器能给出精确的自动补全编译器能在赋值时拦截拼写错误例如type O a | b | c; const x: O A; // 报错类型 A 不能赋给类型 O实战一用字面量做判别式——可辨识联合Discriminated Unions字面量类型最常见的实战价值是作为可辨识联合Discriminated Unions的判别属性discriminant。仓库的 Unioni discriminate 章节定义可辨识联合是一种联合类型它利用一个公共属性称为判别式来收窄联合中可能的类型集合。type Square { kind: square; // 判别式 size: number; }; type Circle { kind: circle; // 判别式 radius: number; }; type Shape Square | Circle; const area (shape: Shape) { switch (shape.kind) { case square: return Math.pow(shape.size, 2); case circle: return Math.PI * Math.pow(shape.radius, 2); } }; const square: Square { kind: square, size: 5 }; const circle: Circle { kind: circle, radius: 2 }; console.log(area(square)); // 25 console.log(area(circle)); // 12.566370614359172这里的kind属性类型是字面量联合square | circle。在switch的case square分支内TypeScript 会把shape精确收窄为Square因此可以安全访问shape.size同理case circle分支内可访问shape.radius。判别式必须使用字面量类型才能触发这种收窄——这正是字面量类型精确性的直接体现。实战二配合类型收窄Narrowing与类型保护Type Guards字面量联合类型与**类型收窄Narrowing**天然互补。仓库的 Restringimento 章节定义TypeScript 的收窄是在条件块内精化变量类型的过程在处理联合类型时尤其有用。该章节列举了多种收窄方式其中与字面量类型直接相关的有相等性收窄Equality Narrowing——配合switch与、!、、!等运算符按字面量值收窄类型const checkStatus (status: success | error) { switch (status) { case success: return true; case error: return null; } };switch的每个case本质上都在与字面量success、error做相等比较TypeScript 借此把status收窄到对应的字面量单元素类型。typeof 收窄typeof guards——按 JavaScript 运行时类型收窄适合原始值联合const fn (x: number | string) { if (typeof x number) { return x 1; // 此处 x 是 number } return -1; };真值收窄Truthiness Narrowing——通过变量真假判断收窄const toUpperCase (name: string | null) { if (name) { return name.toUpperCase(); } else { return null; } };in运算符收窄与instanceof收窄——分别按属性存在性与构造函数实例判断收窄type Dog { name: string; breed: string; }; type Cat { name: string; likesCream: boolean; }; const getAnimalType (pet: Dog | Cat) { if (breed in pet) { return dog; } else { return cat; } };class Square { constructor(public width: number) {} } class Rectangle { constructor( public width: number, public height: number ) {} } function area(shape: Square | Rectangle) { if (shape instanceof Square) { return shape.width * shape.width; } else { return shape.width * shape.height; } } const square new Square(5); const rectangle new Rectangle(5, 10); console.log(area(square)); // 25 console.log(area(rectangle)); // 50此外类型系统探索 章节还介绍了Array.isArray()等内置守卫以及当内置手段不够用时可以用**用户自定义类型保护type predicates**来收窄——它本质上是返回布尔值并带有value is T签名的函数。字面量类型是这些收窄操作中最细粒度的终点类型之一。实战三穷尽性检查Exhaustiveness Checking与never字面量联合类型加上never类型可以实现著名的穷尽性检查Exhaustiveness Checking。仓库的 Controllo di esaustività 章节的定义与示例穷尽性检查是 TypeScript 的一项特性它保证可辨识联合的所有可能分支都在switch或if中被处理。type Direction up | down; const move (direction: Direction) { switch (direction) { case up: console.log(Spostamento verso l\alto); break; case down: console.log(Spostamento verso il basso); break; default: const exhaustiveCheck: never direction; console.log(exhaustiveCheck); // 这行永远不会执行 } };原理当up与down都被case处理完后default分支里direction的类型已被收窄为never。把never赋给never是合法的因此当前代码编译通过。一旦有人给Direction联合新增成员比如leftdefault分支中direction的类型就不再是neverconst exhaustiveCheck: never direction就会报错——编译器立刻提醒你新增的分支尚未处理。这是字面量联合 never构成的编译期兜底网络保证状态演进时不会漏掉任何 case。实战四模板字面量联合类型Template Union Types字面量类型还能与**模板字面量类型Template Literal Types**结合在类型系统内直接拼接、生成新的字面量联合。仓库的 Tipi di unione di template 章节示例type Status active | inactive; type Products p1 | p2; type ProductId id-${Products}-${Status}; // 结果为id-p1-active | id-p1-inactive | id-p2-active | id-p2-inactive模板字面量类型会对嵌入的联合类型做笛卡尔积展开把2 × 2组合成 4 个字面量成员。这让开发者能在编译期声明并校验诸如路由路径、事件名、ID 格式、CSS 类名等需要格式约定的字符串无需任何运行时校验代码。让字面量更精确const断言与泛型const修饰符前文提到对象属性默认会被拓宽为宽泛类型。要保留字面量精度仓库 类型系统探索 章节给出了一套完整的工具链对单个属性使用as constconst v { x: 3 as const, }; v.x 3;对整个对象使用as constconst v { x: 1, y: 2, } as const;对元组使用as const——数组默认推断为可变的number[]加as const后变成只读元组const x [1, 2, 3]; // number[] const y [1, 2, 3] as const; // readonly [1, 2, 3]TypeScript 5.0 的泛型const修饰符——在泛型参数上写const可以让 TypeScript 推断出最精确的可能类型从而保留字面量// 不使用 const属性被拓宽 function identityT(value: T) { return value; } const values identity({ a: a, b: b }); // 推断结果{ a: string; b: string; }// 使用 const 修饰符属性保留为字面量 function identityconst T(value: T) { return value; } const values identity({ a: a, b: b }); // 推断结果{ a: a; b: b; }同时该章节强调如果希望变量类型始终精确也可以使用显式类型标注比如const v: { x: 1 | 2 | 3 }让字面量联合作为目标类型直接约束赋值。小结字面量类型在 The Concise TypeScript Book 中的位置字面量类型字符串、数字、布尔是 TypeScript 类型系统中最精确的构建块。在 The Concise TypeScript Book 的体系里它们贯穿多个核心章节定义见 Tipi letterali单元素集合值是 JavaScript 原始值推断规则见 Inferenza letteraleconst保留字面量let/对象属性拓宽可用as const或as X修复组合方式见 Union Type 与 Tipi di unione di template|组成取值白名单模板字面量自动展开组合应用模式见 Unioni discriminate判别式、Restringimento收窄、Controllo di esaustivitànever兜底精度控制见 Esplorazione del sistema di tipias const、泛型const修饰符、集合论视角。在实际项目中建议把需要枚举取值的字段状态、方向、类型标签、ID 前缀等优先声明为字面量联合类型再配合switch收窄与never穷尽性检查即可把大量运行期错误提前到编译期拦截——这是 TypeScript 相对 JavaScript 的核心价值之一也是本书反复强调的实践方向。赞分享文档教程【免费下载链接】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深入理解 TypeScript 字面量类型Literal TypesThe Concise TypeScript Book深入理解 TypeScript 字面量类型Literal Types 字面量类型Literal T文档教程TypeScript 字面量类型Literal Types完全指南从单元素集合到联合、收窄与实战TypeScript 字面量类型Literal Types完全指南从单元素集合到联合、收窄与实战 本文以《The Concise TypeScript B文档教程The Concise TypeScript Book 之模板联合类型Template Union Types实战详解The Concise TypeScript Book 之模板联合类型Template Union Types实战详解 本文以《The Concise Ty文档教程上一篇Umi Lint 指南基于 ESLint 与 Stylelint 的开箱即用编码规范实践下一篇ThinkPad风扇控制终极指南掌握128级精准调速实现智能散热优化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

【关注可白嫖源码】--课程设计+毕业设计+springboot学生心理素质管理APP[编号:project20702](案例分析)
【关注可白嫖源码】--课程设计+毕业设计+springboot学生心理素质管理APP[编号:project20702](案例分析)

本文仅展示核心实现逻辑与部分代码片段,完整项目源码、配套文档、数据库脚本内容较多,篇幅有限无法全部放出。 有需要完整资源的同学,可以在评论区留言【资料或领源码】,我会一 一回复站内私信,发送完整文件 目录 摘 … · 2026/9/26 2:58:14

Kata Containers 之 dbs-pci crate 深度解析:轻量级 VMM 中的 PCI 设备模拟与直通框架
Kata Containers 之 dbs-pci crate 深度解析:轻量级 VMM 中的 PCI 设备模拟与直通框架

云原生容器运行时 【免费下载链接】kata-containers Kata Containers is an open source project and community working to build a standard implementation of lightweight Virtual Machines (VMs) that feel and perform like containers, but provide the workload isolat… · 2026/9/26 2:58:08

基于YOLOv5与ResNet18的骨龄检测双模型方案:从数据到部署
基于YOLOv5与ResNet18的骨龄检测双模型方案:从数据到部署

简介:本资源面向计算机视觉方向的本科与研究生毕业设计需求,提供一套基于YOLOv5与ResNet18联合实现的骨龄检测完整工程,适合需要完成高分毕设、课程设计或医学影像入门实践的同学。项目将目标检测与图像分类串联,先定位手骨关键区… · 2026/9/26 2:58:08

RPA选型总烂尾?三大根源与泛微千里聆适用边界全解析
RPA选型总烂尾?三大根源与泛微千里聆适用边界全解析

先说我这些年在企业里看到的RPA项目,十个里有六七个是“选型那一刻就注定要烂尾”的。不是因为产品不行,而是很多企业把RPA选型当成了一次普通软件采购——看演示、比价格、谈商务,却完全没想清楚自己要解决什么问题、现有系统长什么样、未来… · 2026/9/26 3:33:39

MySQL8.0定时删除数据实战:Event Scheduler与分批清理大表日志
MySQL8.0定时删除数据实战:Event Scheduler与分批清理大表日志

先说个真实场景。我去年接手一套订单系统的时候,发现一张操作日志表在半年内从不到1GB涨到了近30GB。业务方最初说“日志不删也不影响主流程”,直到某天大促脚本在凌晨跑批卡了十几分钟,磁盘IO被日志表的数据文件打到接近100%,清理… · 2026/9/26 3:33:27

S004H-基于STM32智能门禁系统(密码、指纹、蓝牙)【Proteus仿真+Keil程序+原理图】
S004H-基于STM32智能门禁系统(密码、指纹、蓝牙)【Proteus仿真+Keil程序+原理图】

☆、设计硬件组成:STM32单片机最小系统4*4矩阵键盘AS608指纹识别模块HC-05蓝牙模块OLED液晶显示继电器蜂鸣器红色LED灯; 1、本设计采用STM32F103C8T6单片机作为主控芯片; 2、实时显示:通过OLED液晶显示屏实时显示操作信息&#… · 2026/9/26 3:33:27

Snail-Job:简介、原理、实战
Snail-Job:简介、原理、实战

概述 官网,Java实现、开源(Gitee,3.6K Star,652 Fork;GitHub,822 Star,112 Fork)灵活,可靠和快速的分布式任务重试和分布式任务调度平台。在线体验地址,登录… · 2026/9/26 3:33:21

刷短视频越刷越累?从注意力消耗到戒断方案,找回生活主动权
刷短视频越刷越累?从注意力消耗到戒断方案,找回生活主动权

每天刷5小时抖音,听起来像句玩笑,但我身边真的有人做到了,而且一刷就是大半年。更可怕的是,刷之前他们觉得“这是在休息”,刷完之后却经常皱着眉头说“好累,什么都没干”。标题里我用“精神自残”这四个字&… · 2026/9/26 3:33:15

NCM转MP3原理与实战:ncmdump本地解密全指南
NCM转MP3原理与实战:ncmdump本地解密全指南

1. 项目概述:为什么一个“NCM转MP3”的工具能引发全网搜索狂潮?你有没有过这样的经历:在网易云音乐里反复单曲循环一首歌,收藏夹里存了上百首“仅限APP内播放”的歌曲,某天想把它们导进车载音响、传到老式MP3播放器、或… · 2026/9/26 3:33:15

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码