当前位置: 首页 > news >正文

TypeScript 映射类型:Readonly、Partial、Required 的深度解析

TypeScript 映射类型:Readonly、Partial、Required 的深度解析

在 TypeScript 的类型系统中,映射类型(Mapped Types)是一种强大的工具,它允许开发者基于现有的类型创建新的类型。通过映射类型,可以方便地对类型的每个属性进行转换或操作,而无需手动重新定义整个类型。本文将详细介绍三种常用的映射类型:Readonly、Partial 和 Required,探讨它们的用途、实现原理以及在实际开发中的应用场景。

Readonly:创建只读类型

Readonly 是 TypeScript 提供的一个内置映射类型,它的作用是将一个类型的所有属性都设置为只读。这意味着,一旦使用 Readonly 创建了一个新类型,该类型的任何属性都不能被重新赋值。

基本用法

typeOriginalType={name:string;age:number;};typeReadonlyType=Readonly<OriginalType>;constobj:ReadonlyType={name:'Alice',age:25,};obj.name='Bob';// 错误:Cannot assign to 'name' because it is a read-only property.

在上述代码中,OriginalType 定义了一个包含 name 和 age 属性的对象类型。通过 Readonly 映射类型,我们创建了一个 ReadonlyType,它的所有属性都变成了只读。尝试修改 obj 的 name 属性会导致编译错误。

实现原理

Readonly 的实现原理相对简单,它使用了 TypeScript 的映射类型语法,遍历原始类型的每个属性,并为每个属性添加 readonly 修饰符。其大致实现如下(简化版):

typeMyReadonly<T>={readonly[PinkeyofT]:T[P];};

在这个自定义的 MyReadonly 类型中,[P in keyof T] 是一个映射类型的关键部分,它表示遍历 T 类型的所有键(属性名),并为每个键创建一个新的属性,同时保留原始属性的类型 T[P]。通过添加 readonly 修饰符,我们确保了新类型的每个属性都是只读的。

Partial:创建部分类型

Partial 是另一个常用的内置映射类型,它的作用是将一个类型的所有属性都设置为可选。这在处理某些场景时非常有用,比如当我们需要更新一个对象的部分属性时,不需要提供所有属性的值。

基本用法

typeOriginalType={name:string;age:number;};typePartialType=Partial<OriginalType>;constobj:PartialType={name:'Alice',// age 可以省略};

在上述代码中,PartialType 是通过 Partial 映射类型从 OriginalType 创建的。由于所有属性都变成了可选,因此在定义 obj 时,可以只提供 name 属性,而省略 age 属性。

实现原理

Partial 的实现原理与 Readonly 类似,也是通过映射类型遍历原始类型的每个属性,并为每个属性添加 ? 修饰符,使其成为可选属性。其大致实现如下(简化版):

typeMyPartial<T>={[PinkeyofT]?:T[P];};

在这个自定义的 MyPartial 类型中,[P in keyof T]? 表示遍历 T 类型的所有键,并为每个键创建一个新的可选属性,同时保留原始属性的类型 T[P]。

Required:创建必需类型

与 Partial 相反,Required 映射类型的作用是将一个类型的所有属性都设置为必需。这在处理某些需要确保所有属性都被提供的场景时非常有用。

基本用法

typeOriginalType={name?:string;age?:number;};typeRequiredType=Required<OriginalType>;constobj:RequiredType={name:'Alice',age:25,// 如果省略任何一个属性,都会导致编译错误};

在上述代码中,OriginalType 的所有属性都是可选的。通过 Required 映射类型,我们创建了一个 RequiredType,它的所有属性都变成了必需。因此,在定义 obj 时,必须提供 name 和 age 属性的值,否则会导致编译错误。

实现原理

Required 的实现原理是通过映射类型遍历原始类型的每个属性,并移除每个属性上的 ? 修饰符(如果存在的话),从而使其成为必需属性。由于 TypeScript 的类型系统没有直接提供“移除可选修饰符”的语法,因此 Required 的实现稍微复杂一些,它使用了条件类型和 never 类型来间接实现这一目标。其大致实现如下(简化版):

typeMyRequired<T>={[PinkeyofT]-?:T[P];};

在这个自定义的 MyRequired 类型中,[P in keyof T]-? 表示遍历 T 类型的所有键,并为每个键创建一个新的属性,同时移除原始属性上的可选修饰符(如果存在的话)。-? 是 TypeScript 提供的一个语法,用于移除属性的可选修饰符。

总结

映射类型是 TypeScript 类型系统中一个非常强大的特性,它允许开发者基于现有的类型创建新的类型。Readonly、Partial 和 Required 是三种常用的内置映射类型,它们分别用于创建只读类型、部分类型和必需类型。通过理解它们的用途和实现原理,我们可以更好地利用这些映射类型来提高代码的健壮性和可维护性。在实际开发中,根据具体的需求选择合适的映射类型,可以大大简化类型定义和类型检查的工作。

http://www.cnnetsun.cn/news/2623669.html

相关文章:

  • 拆解 LangChain:为什么说它是“胶水框架“?
  • Chatbox:如何优雅实现多AI模型API的统一配置管理
  • Fate/Grand Automata:3步实现FGO游戏自动化的终极指南
  • 营收创新高、指引大幅上调,Marvell数据中心业务燃爆,与英伟达扩大合作
  • Java 8+ JSR310 时间日期API全攻略:从核心原理到生产级避坑实战
  • 降AI率工具真的有用吗?2026实测6款主流工具避坑指南
  • 广州周年庆活动策划哪个更值得推荐
  • BG3模组管理器终极指南:5步解决模组冲突,轻松管理《博德之门3》模组
  • 专业开发者指南:使用pywencai高效获取同花顺问财金融数据
  • 八大网盘下载困境如何破局?LinkSwift直链助手全攻略
  • 语音AI正在越过“恐怖谷”?独家披露头部厂商未公开的MOS衰减曲线——训练数据量每增10万条,自然度仅提升0.08分!
  • Sora 2数字人视频制作全流程拆解(从文本驱动到唇形同步精度达98.7%的工业级标准)
  • Sora 2可视化性能瓶颈全图谱,含TensorRT加速对比表、显存占用热力图与帧率衰减曲线
  • qmcdump终极指南:如何一键解锁QQ音乐加密格式,让音乐自由播放 [特殊字符]
  • ArkUI -- 状态管理的更新机制
  • DistroAV完整指南:如何通过NDI技术实现OBS Studio网络视频传输
  • 三步解锁:Mac用户如何零成本解决跨平台局域网通信难题
  • AI写论文哪个好用?2026年5款AI写论文工具指南,避开知网查重常见问题!
  • Gemini流式响应在Go中的零拷贝处理术:降低GC压力68%,吞吐提升2.3倍
  • Claude长文本处理卡顿诊断指南(含火焰图分析+KV Cache内存泄漏定位工具链)
  • 如何使用Legacy iOS Kit实现旧款iOS设备降级与越狱的完整指南
  • AbMole丨Rocaglamide:一种能调控翻译起始与细胞应激反应的天然产物
  • 第十三周学习
  • Rio框架:用纯 Python 搞定前后端,构建现代化 Web 与桌面应用
  • 深度解析MKL24Z32VLH4:64引脚Kinetis KL2系列ARM Cortex-M0+超低功耗MCU
  • Pythonclassmethod与staticmethod深究
  • 旧电脑电源改造DIY实验电源:低成本实现多路可调稳压输出
  • 企业内网应用通过Taotoken代理安全稳定地调用外部大模型API
  • 如何通过curl命令快速测试Taotoken多模型API的连通性与响应
  • 对比直接调用与通过聚合平台调用,网站AI服务延迟稳定性感受