ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

《The Concise TypeScript Book》内建类型原语完全指南:从 number 到 never 的实战讲解

《The Concise TypeScript Book》内建类型原语完全指南:从 number 到 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点击查看免费下载TypeScript 在内建层面提供了一批「类型原语built-in type primitives」它们是声明变量、函数参数与返回值类型的最小积木。本文以开源仓库 website/src/content/docs/fr-fr/book/built-in-type-primitives.md 为骨架逐一对number、string、boolean、null、undefined、symbol、bigint、any、void、never十个内建类型展开讲解并结合仓库中其他章节原语类型、any、void、never、strictNullChecks与编译配置源码进行佐证。读完本文你将能够为任意变量、参数和返回值选择最合适的原语类型理解void与never、null与undefined的关键差异并掌握如何借助strictNullChecks、noImplicitAny等编译选项把类型安全落到实处。内建类型原语一览TypeScript 中这些内建类型原语可以用于标注变量、函数参数与函数返回值的类型。先给出全景清单后文逐一深入类型语义典型用途number数值包含整数与浮点数计数、金额、坐标等所有数值运算string文本数据名称、消息、拼接文本boolean逻辑值true/false开关、标志位、判断结果null有意地表示没有值显式声明字段当前不可用undefined尚未赋值/未定义的值未初始化变量、可选参数symbol唯一标识符对象属性的唯一键避免命名冲突bigint任意精度整数超过 2^53 - 1 的大整数运算any动态或未知类型绕过类型检查无类型声明的外部 API/库数据、渐进式迁移void没有任何类型不返回值的函数返回值类型never永远不出现的值抛错或无限循环的函数的返回值类型在深入之前需要明确一个前提见仓库 primitive-types.md原语数据类型指不是对象、也不挂载任何方法的类型且所有原语类型都是不可变的immutable——一旦赋值其值不能再被改变。这是理解string、number等类型一切行为的基础。number64 位浮点数值number表示数值包括整数与浮点数。按照仓库 primitive-types.md 的说明TypeScript 中的number以64 位浮点值表示可以承载整数与小数。除了常见的十进制字面量TypeScript 还支持十六进制、二进制与八进制字面量const decimal: number 10; const hexadecimal: number 0xa00d; // 十六进制以 0x 开头 const binary: number 0b1010; // 二进制以 0b 开头 const octal: number 0o633; // 八进制以 0o 开头实际使用要点浮点数比较如0.1 0.2仍受 IEEE 754 精度限制需要精确计算时应考虑整数化或使用专用库需要表达超过Number.MAX_SAFE_INTEGER2^53 - 1的整数时应切换到下文介绍的bigint64 位浮点的具体行为由 JavaScript 运行时决定TypeScript 只负责类型标注不改变运行语义。string文本数据string存储文本数据其值总是被单引号或双引号包裹const x: string x; const y: string y;当字符串需要跨越多行时使用反引号包围这是 TypeScript/JavaScript 的模板字符串语法let sentence: string xxx, yyy;实际使用要点模板字符串中可以直接嵌入表达式如value: ${x}由于字符串是原语且不可变所有修改操作如concat、slice、toUpperCase都会返回新字符串原值不变类型层面字面量字符串可以进一步收窄为字面量类型literal types这部分内容见仓库 literal-types.md。boolean二值逻辑boolean存储二值要么是true要么是falseconst isReady: boolean true;实际使用要点不要用0、1、空字符串等隐式真值替代boolean显式布尔类型可读性与安全性更高与null/undefined判断结合时配合strictNullChecks见下文可以获得更精确的收窄结果。null 与 undefined两种没有值null和undefined都表示没有值但二者的语义在 TypeScript 约定中有所区分undefined表示值未被赋值或未被定义属于非主动的缺失null表示我们明确知道字段当前没有值属于主动声明的缺失。类型语义典型场景undefined未初始化、未赋值非主动缺失尚未初始化的变量、可选参数缺省值null主动声明此处无值API 返回无此记录、配置项显式留空在默认未开启strictNullChecks情况下null和undefined可以赋给任意类型而在严格模式下只有显式声明为null | undefined联合类型的变量才能接受它们。仓库专门用一个章节讲解该编译选项见 strictnullchecks.mdstrictNullChecks是 TypeScript 编译选项用于强制严格的空值检查。启用后null或undefined只能赋给显式声明了联合类型null | undefined的变量与参数若变量未显式声明为可空TypeScript 会报错以预防潜在的运行时错误。因此在启用了strictNullChecks的项目中可空字段应这样声明let maybeName: string | null null; // 显式可空 let notYet: string | undefined; // 尚未初始化symbol唯一标识符symbol表示唯一标识符通常用作对象属性的键以避免命名冲突。由于每次Symbol()调用都产生唯一值两个Symbol(a)并不相等。仓库 primitive-types.md 给出了用symbol作为对象键的完整示例type Obj { [sym: symbol]: number; }; const a Symbol(a); const b Symbol(b); let obj: Obj {}; obj[a] 123; obj[b] 456; console.log(obj[a]); // 123 console.log(obj[b]); // 456实际使用要点每个Symbol()实例都独一无二适合实现名义唯一的键防止外部代码意外覆盖Symbol.for()会创建/复用全局共享 symbol与上述每次唯一的行为不同按需选择TypeScript 支持unique symbol这种更精确的类型用于声明常量级别的唯一 symbol。bigint任意精度整数bigint表示任意精度整数可以安全承载大于number最大安全整数2^53 - 1的整数值。创建方式有两种调用内建函数BigInt()或在整数字面量末尾加nconst x: bigint BigInt(9007199254740991); const y: bigint 9007199254740991n;仓库 primitive-types.md 特别强调两条注意事项bigint值不能与number直接混用也不能与内建对象Math一起使用必须先将它们强制转换为同一类型再做运算bigint值仅在编译目标target为 ES2020 或更高版本时可用。// 错误示范bigint 与 number 混用 // const bad 1n 1; // 正确示范显式转换到同一类型 const ok BigInt(1) 1n; // 2n这一目标版本约束并非理论假设——仓库自身的编译工具链同样使用现代目标。在 tools/compile.ts 中本书的代码编译配置即为target: ts.ScriptTarget.ESNext且开启了noImplicitAny: true表明全书示例都面向支持bigint的现代目标编译。any动态/未知类型谨慎使用any表示任意值。根据仓库 any-type.md它是一个特殊类型universal supertype通用超类型可以表示任何类型的值原语、对象、数组、函数、错误、symbol。它常用于编译期类型未知的场合或来自没有 TypeScript 类型声明的外部 API/库的值。let value: any; value true; // Valid合法 value 7; // Valid合法使用any等于向编译器声明这些值不受任何限制代价是完全跳过类型检查、失去类型安全。仓库 primitive-types.md 明确指出any是当 TypeScript 无法推断类型或类型未指定时的默认类型。使用any时编译器跳过类型检查因此没有任何类型安全。一般不要在出错时用any让编译器闭嘴而应专注修复错误——用any会破坏类型契约并丧失 TypeScript 自动补全的优势。any-type.md 给出了三条实践准则将any的用法限制在类型确实未知的具体场景不要从函数返回any类型否则会削弱所有调用方代码的类型安全如果只是为了静默编译器的某个具体报错优先使用ts-ignore而不是any。any唯一被认可的合理场景是从 JavaScript 渐进式迁移到 TypeScript时用于暂时压制错误。对于新项目应启用noImplicitAny编译选项让 TypeScript 在出现any或推断出any的地方直接报错。仓库中该选项已被实际启用见 tools/tsconfig.json 与 tools/compile.ts。void无返回值的函数void表示没有任何类型最常用的场景是标注不返回任何值的函数的返回值类型仓库 void-type.mdconst sayHello (): void { console.log(Hello!); };实际使用要点函数体内只要没有return语句或仅return;返回类型就是voidvoid与undefined不同void是无类型的占位概念undefined是一个实际存在的值类型。一个返回void的函数并不承诺返回undefined调用方不应消费其返回值在回调函数如事件监听器中标注void可以表达返回值被忽略的意图。never永远不会出现的值never表示永远不出现的值用于标注永不返回或必定抛错的函数/表达式仓库 never-type.md。典型场景一无限循环。const infiniteLoop (): never { while (true) { // do something } };典型场景二必然抛错。const throwError (message: string): never { throw new Error(message); };never的更大价值在于配合控制流分析提升类型精度。仓库 never-type.md 给出经典的穷尽性检查exhaustiveness checking示例当switch覆盖了联合类型的所有分支后default分支中变量会被收窄为never此时把它赋给never类型的变量编译器就能在你漏掉某个分支时报错type Direction up | down; const move (direction: Direction): void { switch (direction) { case up: // move up break; case down: // move down break; default: const exhaustiveCheck: never direction; throw new Error(Unhandled direction: ${exhaustiveCheck}); } };如果未来Direction新增了left分支而switch未同步更新direction在default中就不再是never赋值会触发编译错误——这正是never帮助你提前发现潜在错误的方式。关于穷尽性检查的更完整讨论可参考仓库 exhaustiveness-checking.md。原语类型与数组、元组的关系需要澄清的是严格意义上的内建类型原语是上述 10 种标量类型但在日常声明中array数组与tuple元组也常与原语类型组合出现。仓库 primitive-types.md 给出了标准的数组声明语法const x: string[] [a, b]; const y: Arraystring [a, b]; const j: Arraystring | number [a, 1, b, 2]; // 联合类型以及只读数组与只读元组const x: readonly string[] [a, b]; // readonly 修饰符 const y: ReadonlyArraystring [a, b]; const j: ReadonlyArraystring | number [a, 1, b, 2]; // j.push(x); // 无效只读数组不允许修改 const t: [string, number] [a, 1]; // 元组 const rt: readonly [string, number] [a, 1]; // 只读元组关于元组与标签的深入内容可继续阅读仓库 fixed-length-tuple.md、named-tuple-type-labeled.md 等章节。在真实编译配置中落地这些原语原语类型只有配合正确的编译选项才能真正保障安全。仓库的书籍工具链tools/compile.ts、tools/tsconfig.json是很好的参考——全书代码在编译时同时启用了noImplicitAny与target: ts.ScriptTarget.ESNext。这意味着在本书语境下任何隐式any都会被编译器拒绝noImplicitAny倒逼开发者显式书写string、number、boolean等原语标注现代目标ESNext保证bigint、symbol等新原语在编译层面可用。对你自己的项目建议在tsconfig.json中至少开启以下两项{ compilerOptions: { strict: true, // 包含 strictNullChecks、noImplicitAny 等 target: ES2020 // 使用 bigint 的最低要求 } }其中strict: true会同时启用strictNullChecks强制可空性检查与noImplicitAny拒绝隐式any这是把null/undefined、any等原语类型纳入强类型体系的关键一步。小结TypeScript 的十个内建类型原语构成了类型系统的地基number、string、boolean覆盖日常标量数据null与undefined表达两种不同语义的缺失symbol提供唯一键bigint扩展整数范围any用于渐进迁移但必须谨慎void标注无返回值函数never则借助控制流分析实现穷尽性检查。配合strictNullChecks、noImplicitAny等编译选项仓库 tools/compile.ts、tools/tsconfig.json 即为启用实例这些原语能真正转化为可验证的类型安全。本文对应的完整法语原文档位于 built-in-type-primitives.md其余语言版本如英文版 built-in-type-primitives.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 内置原始类型全解number、string、symbol、bigint 与 never 等 10 种核心类型实战指南The Concise TypeScript BookTypeScript 内置原始类型全解number、string、symbol、bigint 与 never 等 10 种核心类型实战指南The Conci文档教程The Concise TypeScript Book 精讲条件类型Conditional Types从语法到实战The Concise TypeScript Book 精讲条件类型Conditional Types从语法到实战 条件类型Conditional Ty文档教程The Concise TypeScript Book 精讲深入理解 never 类型与穷尽性检查实战The Concise TypeScript Book 精讲深入理解 never 类型与穷尽性检查实战 never 是 TypeScript 内置类型中最特殊文档教程上一篇RVC变声器终极指南10分钟训练专业级AI音色模型的完整教程下一篇终极指南3分钟学会国家中小学智慧教育平台电子课本下载技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表