
文档教程【免费下载链接】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本仓库website/src/content/docs/pt-br/book/mapped-type-modifiers.md所讲解的章节的核心主题展开TypeScript 映射类型Mapped Types中的三类修饰符——readonly/readonly只读、-readonly取消只读、?可选——是如何驱动类型转换的。读者学完后将掌握用映射类型修饰符构造只读、可变、可选类型的标准写法理解其在Partial、Readonly等内置工具类型中的实现原理并能在实际项目中安全地应用和扩展这些模式。1. 从映射类型说起修饰符的作用对象要理解修饰符首先要明确它们“修饰”的是什么。TypeScript 的映射类型允许你基于一个已有类型用keyof取出其全部属性键再逐一对每个属性进行变换生成一个新类型。映射类型的骨架如下type MyMappedTypeT { [P in keyof T]: T[P][]; };这里[P in keyof T]就是“映射”动作本身P遍历T的所有键T[P]通过索引访问取得每个属性的原类型。上面的例子把每个属性的类型改成了“原类型的数组”。比如type MyType { foo: string; bar: number; }; type MyNewType MyMappedTypeMyType; const x: MyNewType { foo: [hello, world], bar: [1, 2, 3], };MyNewType与MyType表达同样的信息键名不变但每个值的形态被转换成了数组。映射类型修饰符正是在这个“逐属性变换”的骨架之上额外叠加readonly、?等标记对每个属性的可变性与可选性进行批量改写。想深入了解映射类型本身可阅读本仓库的 mapped-types.md 章节。2. 三大修饰符的语义本节对应原文档的核心要点readonly含readonly、-readonly与?。它们的共同点是都写在映射类型的花括号内部、属性声明的位置上作用于被遍历到的每一个属性。修饰符写法位置作用readonly/readonly属性键之前将映射后的属性标记为只读禁止重新赋值-readonly属性键之前移除只读标记使属性恢复可写可变?属性键之后将属性标记为可选可缺省说明本文“属性键”指[P in keyof T]这段映射表达式本身例如readonly [P in keyof T]: T[P]中readonly位于映射表达式之前。需要特别区分的是?修饰符在原文档中没有给出显式的-?写法-?表示移除可选标记是RequiredT工具类型的底层实现属 TS 4.1 引入的能力。以当前章节文档为准我们聚焦?的“添加可选”语义。3. 原文档代码示例只读、可变、可选三种变换原文档mapped-type-modifiers.md给出三个可直接运行的类型定义type ReadOnlyT { readonly [P in keyof T]: T[P] }; // 所有属性标记为只读 type MutableT { -readonly [P in keyof T]: T[P] }; // 所有属性标记为可变 type MyPartialT { [P in keyof T]?: T[P] }; // 所有属性标记为可选逐一拆解ReadOnlyT对T的每个属性都加上readonly得到一个所有属性均不可重新赋值的类型。实际使用时type Person { name: string; age: number }; type ReadonlyPerson ReadOnlyPerson; const p: ReadonlyPerson { name: Simon, age: 17 }; p.name John; // 编译错误无法分配给只读属性 nameMutableT-readonly是“移除只读”的显式写法。它常用于把某个已被冻结readonly的类型重新开放为可写。即便输入类型本没有readonly属性结果也保持一致对非只读属性移除只读是无操作。示例type FrozenConfig { readonly host: string; readonly port: number }; type WritableConfig MutableFrozenConfig; // 结果类型{ host: string; port: number }MyPartialT对所有属性加上?等价于内置的PartialT。它常用于参数对象“全部可缺省”的场景type PartialPerson MyPartialPerson; // 结果类型{ name?: string; age?: number } function updatePerson(p: PartialPerson) { /* 只更新传入的字段 */ }4. 结合仓库源码的纵深剖析4.1 与内置工具类型的关系MyPartialT实际就是手写的PartialTReadOnlyT即手写的ReadonlyT。在 TypeScript 的标准库中PartialT{ [P in keyof T]?: T[P] }ReadonlyT{ readonly [P in keyof T]: T[P] }RequiredT{ [P in keyof T]-?: T[P] }也就是说原文档的示例正是在实现这些官方工具类型。本仓库的 type-manipulation.md 章节对PartialT、RequiredT、ReadonlyT等工具有系统讲解例如PartialPerson展开为{ name?: string | undefined; age?: string | undefined }RequiredPerson将可选属性重新置为必选ReadonlyPerson则禁止后续赋值a.name John属非法操作可对照阅读。4.2 仓库内真实使用佐证当前仓库The Concise TypeScript Book 的官方网站与构建代码在自身代码中广泛使用这些模式可作为“只读映射”的实际应用样本website/src/data/plusEdition.ts 中多处使用ReadonlyRecordstring, ...声明配置对象例如LOCALE_BY_LANG、PLUS_EDITION_COVERS、AMAZON_DOMAINS_BY_REGION均为ReadonlyRecord...类型。这展示了“只读修饰符批量作用于 Record 的所有属性”这一组合RecordK, T本身是{ [P in K]: T }的映射类型外层再套Readonly...即为双重映射。website/src/config/locales.ts 中export type Locale keyof typeof locales;是keyof取键的典型用例——它正是映射类型[P in keyof T]中“键集合”的来源与修饰符示例中的keyof T一脉相承。此外仓库对?可选属性的基础语义也有专门章节optional-properties.md 展示了b?: number的可选声明及解构默认值写法({ a, b 100 }: X) a breadonly-properties.md 则说明了readonly只能防止重写、不能保证深层不可变性并给出Readonly{ a: number }与只读索引签名readonly [index: number]: string的写法。这两章共同补全了修饰符的“单属性”语义基础。5. 修饰符与映射类型其他能力的组合映射类型修饰符不是孤立的它与本仓库其他章节介绍的映射能力经常搭配使用与索引访问类型组合T[P]本质是索引访问见 type-indexing.md 与 type-manipulation.md 中的Person[age]示例。修饰符只改变属性的标记readonly/optional不改变值的类型。与/-显式符号组合readonly与readonly等价属显式“添加”写法-readonly是“移除”。对于?TS 同样支持-?移除可选本仓库的RequiredT讲解即属此列。与键重映射as组合[P in keyof T as NewKey]可同时改名键并施加修饰符例如生成“每个字段名加Id后缀且只读”的类型。该能力结合本仓库 template-union-types.md 中的模板字面量联合如id-${Products}-${Status}可用于构造键名。与索引签名组合readonly [index: number]: string这样的只读索引签名见 readonly-properties.md索引签名的键类型可为string | number | symbol见 index-signatures.md。6. 常见陷阱与实战建议readonly不保证深层不可变ReadonlyT只冻结顶层属性的重新赋值若属性值是对象或数组其内部仍可变。需要递归只读时应自行递归映射可结合条件类型或采用第三方 deep-readonly 方案。-readonly只在映射类型中合法它不能用于普通的对象类型字面量如{ -readonly a: number }是非法的只能出现在[P in keyof T]这样的映射语境中。?的级联效应用MyPartialT得到的可选属性其类型在严格模式下为T[P] | undefined访问前需做空值判断或配合解构默认值见 optional-properties.md。优先复用内置工具类型当目标就是“全部只读”“全部可选”“全部必选”时直接用ReadonlyT、PartialT、RequiredT更符合惯例自定义修饰符类型适合在需要“部分键”或“键重命名”等定制场景使用。多修饰符可叠加{ readonly [P in keyof T]?: T[P] }能同时得到“只读且可选”的属性对既有类型再套Mutable可以“解冻”之前套上的Readonly。7. 小结映射类型修饰符是 TypeScript 类型体操中“批量改写属性标记”的利器readonly/readonly批量冻结-readonly批量解冻?批量转可选。原文档给出的三个手写类型mapped-type-modifiers.md与内置的ReadonlyT、Mutable等价于移除Readonly、PartialT一一对应而本仓库的 type-manipulation.md、readonly-properties.md、optional-properties.md、mapped-types.md 各章节从不同角度印证了这些模式website/src/data/plusEdition.ts 与 website/src/config/locales.ts 则展示了ReadonlyRecord...与keyof在真实项目中的落地用法。掌握这三个修饰符就掌握了在类型层面统一控制“只读性”与“可选性”的核心手段可以进一步向键重映射、递归只读等高阶类型体操延伸。赞分享文档教程【免费下载链接】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 映射类型修饰符Mapped Type Modifiers完全指南readonly、readonly、-readonly 与可选性变换TypeScript 映射类型修饰符Mapped Type Modifiers完全指南readonly、readonly、 readonly 与可选性变文档教程TypeScript 映射类型修饰符Mapped Type Modifiers实战指南readonly、-readonly 与可选属性 ?TypeScript 映射类型修饰符Mapped Type Modifiers实战指南readonly、 readonly 与可选属性 ? 本指南以开源仓文档教程TypeScript 映射类型修饰符Mapped Type Modifiers实战readonly、可变性与可选性的精确变换TypeScript 映射类型修饰符Mapped Type Modifiers实战readonly、可变性与可选性的精确变换 导读 本文围绕开源仓库 Th文档教程上一篇Docker一键部署awesome-kotlin从本地docker-compose开发到生产环境的完整部署指南下一篇30分钟让吃灰的Amlogic盒子亮出桌面Armbian LXDE/XFCE 桌面环境实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考