文档教程【免费下载链接】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 Bookes-es 版字面量类型章节为骨架系统讲解 TypeScript 字面量类型的概念、三种原始字面量字符串、数字、布尔、它们在联合类型、类型守卫与类型别名中的核心用法并结合仓库中 字面量推断、窄化 等相邻章节深入剖析as const断言、类型宽化等实战问题。读完本文你将能准确写出类型安全的字面量联合类型并理解 TypeScript 在何时保留、何时放大字面量的精确类型。什么是字面量类型字面量类型Literal Type是一个集合类型中只包含单个元素的特殊类型它定义的是一个非常精确的值并且这个值必须是一个 JavaScript 原始类型primitive。换句话说普通类型描述的是一类值例如string表示任意字符串而字面量类型描述的是一个具体的值例如字符串字面量a只接受字符a。它把值提升到了类型的层面让类型系统可以表达只能是这一个确切的值这样的约束。在 TypeScript 中字面量类型共有三种数字字面量类型、字符串字面量类型和布尔字面量类型。它们分别由数字、字符串和布尔值的字面量直接派生而来。三种原始字面量类型原文档给出的字面量示例const a a; // String literal type字符串字面量类型 const b 1; // Numeric literal type数字字面量类型 const c true; // Boolean literal type布尔字面量类型const a aa的类型被推断为字符串字面量类型a而不是宽泛的stringconst b 1b的类型被推断为数字字面量类型1const c truec的类型被推断为布尔字面量类型true。这三种字面量对应 TypeScript 的三大原始类型详见仓库 primitive-types.mdstring文本数据、number64 位浮点支持十进制、十六进制0x、二进制0b、八进制0o写法、boolean二值true/false。注意虽然 TypeScript 还有bigint、symbol、null、undefined等原始类型但按官方分类真正形成字面量类型体系的是字符串、数字和布尔三类。显式声明字面量类型除了依赖推断也可以像声明普通类型一样显式标注字面量类型let s: a a; // 只允许赋值为 a let n: 1 1; // 只允许赋值为 1 let b: true true; // 只允许赋值为 true一旦显式声明后续赋值必须是该精确值否则 TypeScript 编译器会报错。字面量类型 × 联合类型定义枚举式取值域字面量类型单独使用时价值有限它的威力在于与联合类型Union Type组合。联合类型用|符号连接多个可能的类型表示值可以是其中任意一种详见仓库 union-type.md。原文档中的核心示例type O a | b | c;这里的O是一个联合类型的类型别名它只由指定的三个字符串字面量组成。O类型的变量只能取a、b、c这三个值中的任意一个任何其他字符串都是非法值let o: O a; // ✓ 合法 o b; // ✓ 合法 o d; // ✗ 错误类型 d 不能赋值给类型 a | b | c这正是字面量类型的核心价值在类型层面建立一份精确的取值白名单把非法输入挡在编译期之前。类似的写法还可以覆盖数字与布尔字面量type Port 80 | 443 | 8080; // 只允许这三个端口 type Flag true | false; // 布尔字面量联合等价于 boolean 但语义更明确 type Status active | inactive | pending;这种模式在现实项目里最常见的用途是模拟枚举 / 状态机把一组固定的状态码、配置键、事件名集中定义为一个联合类型别名编译器就能自动检查所有赋值与比较。字面量联合与类型守卫Narrowing配合原文档明确指出字符串、数字、布尔字面量类型被用于联合unions、类型守卫type guards和类型别名type aliases。其中类型守卫是字面量联合类型运行起来的关键——通过窄化NarrowingTypeScript 会在条件分支内把联合类型收窄到具体的字面量成员。仓库的 narrowing.md 提供了多种与字面量联合密切配合的窄化方式相等性窄化Equality narrowing与 switchconst checkStatus (status: success | error) { switch (status) { case success: return true; case error: return null; } };switch配合、!、、!等相等性运算符时TypeScript 会依据字面量判断把status在分支内收窄为success或error。这类用法要求分支值本身就是字面量因此与字面量联合类型天然契合。typeof 类型守卫const fn (x: number | string) { if (typeof x number) { return x 1; // 此处 x 被收窄为 number } return -1; };typeof守卫依据 JavaScript 内置类型收窄变量适合在数字/字符串字面量与宽泛类型混用时把范围缩小。真值性窄化Truthiness narrowingconst toUpperCase (name: string | null) { if (name) { return name.toUpperCase(); } else { return null; } };真值性窄化通过判断变量是否为真值来排除null、undefined、、0等假值。窄化让字面量联合类型从声明期的约束变成运行期的类型安全分支逻辑是构建可辨识联合discriminated unions的基石——不同分支用不同的字面量成员作为判别字段TypeScript 就能在各分支内精确推导出对应形态。字面量推断Literal Inference何时保留精确值字面量类型能不能被保留下来取决于变量是用const还是let声明的。仓库的 literal-inference.md 专门讲解这一机制const x x; // 字面量类型 x因为 const 声明的值之后无法被修改 let y y; // 类型 string因为 let 声明的值之后可以被修改const x xx的值永远无法改变TypeScript 放心地把它推断为最精确的字面量类型xlet y yy之后可能被重新赋值成任意字符串TypeScript 只能把它放宽widen为string。对象属性会被放宽为宽泛类型同样的规则也作用于对象属性。看原文档中的示例type X a | b; let o { x: a, // 这是一个较宽泛的 string }; const fn (x: X) ${x}-foo; console.log(fn(o.x)); // 错误类型 string 不能赋值给类型 X由于o是用let声明的对象TypeScript 认为o.x之后随时可能被改成其他字符串因此把o.x推断为宽泛的string而不是字面量a。当把o.x传给只接受更窄类型X a | b的参数时编译器报错——窄类型不能安全地接收宽类型。解决方案一as const断言let o { x: a as const, };as const是 TypeScript 提供的类型断言它把表达式断言为最窄的字面量类型相当于把a固定为字面量a且属性只读。此时o.x的类型就是字面量a可以安全传给fn。解决方案二as X断言let o { x: a as X, };或者直接把o.x断言为目标联合类型X明确告诉编译器这个属性就是X的成员同样可以消除错误。实践建议当你希望对象属性保留精确的字面量类型例如配置对象、路由表、常量映射时优先使用as const当属性本身就是某个联合类型的成员时as X更直接。两者都涉及 type-annotations.md 中提到的类型注解思想——必要时显式标注让类型意图更清晰。从值推断类型字面量与const的联动仓库的 type-from-value.md 从从值得到类型的角度再次印证了这一规则const x x; // TypeScript 将 x 推断为字符串字面量const 不可变 // 但用 let 声明时会放宽widen为 string可重新赋值这解释了字面量推断的根本动机TypeScript 必须保证类型在未来所有赋值操作下都保持安全。值不可变 → 类型可以最精确值可变 → 类型必须放宽。理解这一条就能预测几乎所有字面量类型保留或放宽的行为。进阶模板字面量联合类型与字符串工具类型字面量类型还能在类型系统内部参与更高级的文本运算。仓库的 template-union-types.md 展示了模板字面量联合类型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模板字面量类型会把每个联合成员两两组合自动生成全部合法的 ID 形态。这是字面量联合类型在类型层面生成新类型的典型用法。此外type-manipulation.md 中还有一组以字符串字面量为基础的实用工具类型type MyType Uppercaseabc; // ABC type MyType2 LowercaseABC; // abc type MyType3 Capitalizeabc; // Abc type MyType4 UncapitalizeAbc; // abc以及配合字面量联合使用的过滤工具type Union a | b | c; type MyType ExcludeUnion, a | c; // b type MyType2 ExtractUnion, a | c; // a | c这些工具类型接收的正是字面量联合类型进一步说明字面量是 TypeScript 类型操作体系的底层原子。实战综合一个状态机示例把以上知识组合起来可以写出同时体现字面量联合 类型守卫 窄化 推断的完整示例type RequestState idle | loading | success | error; // as const 保留对象属性的字面量类型 const initialState { state: idle as const, code: 0 as const, }; // 基于字面量联合的状态转换 const transition (s: RequestState): RequestState { switch (s) { case idle: return loading; case loading: return success; case success: case error: return idle; } }; console.log(initialState.state); // 类型为 idle而非 string console.log(transition(idle)); // loading该示例中initialState.state借助as const保留了字面量类型transition利用字面量联合类型RequestState约束入参与返回值并用switch完成等式窄化。编译器会在编译期拦截一切非法状态例如transition(pending)会直接报错。小结字面量类型是集合类型中的单元素类型在 TypeScript 中仅针对字符串、数字、布尔三类原始值。字面量类型的核心用法是组成联合类型type O a | b | c形成精确的取值白名单并配合类型守卫switch、、typeof等在分支内完成窄化。const推断为字面量let推断为宽泛类型对象属性默认被放宽可用as const或as X断言强制保留字面量类型。字面量联合还能驱动模板字面量类型与Uppercase/Exclude等工具类型参与更复杂的类型级运算。相关章节可继续查阅仓库中的 literal-types.md、literal-inference.md、union-type.md、narrowing.md 与 template-union-types.md。赞分享文档教程【免费下载链接】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点击查看免费下载相关推荐TypeScript 字面量类型Literal Types完全指南从单元素集合到联合、收窄与实战TypeScript 字面量类型Literal Types完全指南从单元素集合到联合、收窄与实战 本文以《The Concise TypeScript B文档教程Flow 字面量类型Literal Types完全指南从基础语法到 as const 与联合类型的实战应用Flow 字面量类型Literal Types完全指南从基础语法到 as const 与联合类型的实战应用 字面量类型Literal Types是 F开发工具静态分析代码质量TypeScript 类型收窄Narrowing实战指南从联合类型到精确类型推断TypeScript 类型收窄Narrowing实战指南从联合类型到精确类型推断 本文基于开源书籍《The Concise TypeScript Book文档教程上一篇libdatachannel让C/C应用轻松实现实时通信的利器下一篇.NET 裁剪工具冗余警告抑制检测Redundant Suppression Detection实战指南从 IL2070 到 IL2121 的完整闭环创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考