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

TypeScript 高级类型工具:Partial, Required, Record 的妙用与陷阱

在 TypeScript 开发中,灵活运用内置工具类型能极大提升类型安全性和代码简洁度。Partial<T>Required<T> 和 Record<K, T> 是三个高频实用工具,但理解其原理和边界至关重要。

1. Partial<T>:制造“可选”版本

  • 作用: 将类型 T 的所有属性变为可选 (?)。
  • 场景: 适用于对象更新、构造参数等只需提供部分属性的情况。
  • 原理: type Partial<T> = { [P in keyof T]?: T[P]; }
  • 陷阱:
    • 浅层操作: 只作用于 T 的直接属性。若属性本身是对象,该嵌套对象的属性不会变可选。
    • 允许 undefined 开启 --exactOptionalPropertyTypes 后,Partial 的属性实际是 属性类型 | undefined,严格模式需注意。
interface User {id: number; name: string; address: {city: string }; }
const updateData: Partial<User> = {name: "Bob" }; //  只更新 name
// updateData.address?.city  错误!address 本身是必须的(但可为 undefined)
 
 

2. Required<T>:制造“必填”版本

  • 作用: 移除类型 T 中所有属性的可选性 (?),使其全部变为必填。
  • 场景: 确保函数接收完整对象、从 Partial 结果转换回完整对象。
  • 原理: type Required<T> = { [P in keyof T]-?: T[P]; } (注意 -? 语法)
  • 陷阱:
    • 同样只作用于直接属性,嵌套对象内的可选性不受影响。
function createUser(userData: Required<User>) {... } 
const fullUser: Required<User> = {id: 1, name: "Alice", address: {city: "NY" } }; //  所有属性必须存在
 
 

3. Record<K, T>:构建键值映射类型

  • 作用: 构造一个对象类型,其的类型为 K的类型为 T
  • 场景: 动态键名对象(如字典、配置映射)、强制统一值类型。
  • 原理: type Record<K extends keyof any, T> = { [P in K]: T; }
  • 关键点:
    • K 必须是可作对象键的类型(string | number | symbol)。
    • 值类型 T 对所有键完全一致
  • 陷阱:
    • 无法为不同键指定不同的值类型(此时需用索引签名或联合类型)。
type PageInfo = {title: string };
type PageRoutes = Record<'home' | 'about' | 'contact', PageInfo>; 
// 等同于 { home: PageInfo; about: PageInfo; contact: PageInfo; }const config: Record<string, boolean> = {featureA: true, featureB: false }; //  动态键名,统一值类型
 

最佳实践与忠告

  1. 理解“浅层”: 这三个工具仅操作直接属性层。深层次转换需递归工具类型或第三方库(如 ts-toolbelt)。
  2. Partial 非万能: 过度使用 Partial 会弱化类型约束。优先设计精确接口,仅在必要时使用。
  3. Record 约束键: 使用联合类型字面量(如 'a' | 'b')作为 K 能精确限制键名,比 string 更安全。
  4. 组合使用: 工具类型可组合:Partial<Record<keyof User, boolean>> 创建一个可选布尔标记对象。
  5. 编译时魔法: 它们只在编译时存在,不影响运行时。
http://www.jsqmd.com/news/18537/

相关文章:

  • 阿里云EIP指标监控
  • 深入了解linux网络—— TCP网络通信(上) - 详解
  • Spark专题-第三部分:性能监控与实战优化(2)-分区优化 - 详解
  • 补贴防薅测试用例设计
  • 20232313 2025-2026-1 《网络与系统攻防技术》实验二实验报告 - 20232313
  • 理解C++20的革命特性——协程支持2:编写简单的协程调度器 - 实践
  • 站位4
  • 九种UML常见图 -2025.10.19
  • 阿里云 CDN部署
  • 分箱效果评估:IV值和卡方
  • 2025 年电缆桥架生产厂家最新推荐排行榜:聚焦北方 / 河北区域及瓦楞 / 防火 / 模压 / 镀锌桥架优质品牌深度解析
  • 洒水清洁,音乐相伴,洒水车声音-兰花草音乐芯片详细资料
  • 04.Python百行代码制作查询工具
  • 通过一台服务器采集所有阿里云账单费用数据
  • 2025 油烟机厂家最新推荐榜:五大实力厂商技术与服务口碑评测权威发布滑轨/易清洁/免清洗/智能油烟机厂家推荐
  • VUE---打印功能
  • 高效管理超多传感器?SHxxx 集线器实现精准切换与零混淆 告别通道混乱,内置校验
  • [ACTF2020 新生赛]Include 1 文件包含
  • 鸿蒙NEXT网络管理:从“能用”到“智能”的架构演进 - 指南
  • PostgreSQL可观测性完整方案
  • 2025 年通风天窗源头厂家最新推荐:品牌定制能力、售后体系及综合实力深度测评榜单
  • 钡铼技术全新APC系列工业边缘可视化平板电脑即将重磅发布!
  • 2025年大连甘井子区优质养老机构推荐:从社区到自然的暖心之选
  • 2025年AI营销公司推荐:广东AI营销公司/广州AI营销公司如何以模块化服务破解企业增长困局
  • 2025年越南货架厂家推荐榜:立体/高位/仓储/托盘/重型/流利式/贯通式/穿梭车/模具/货架厂家,多维度解析行业实力派
  • 2025年主轴维修厂家企业推荐: 电/高速/精密/磨床/进口磨床/加工中心电/数控机床/高速电主轴维修厂家,服务商助力制造企业降本增效
  • 2025年磨床电主轴先升级推荐榜:国产/进口/内圆/外圆/无心/平面/来图定制磨床电主轴厂家,聚焦精密制造核心
  • 在写left join的时候 是大表在左侧 还是小表在左侧(二)
  • 在写left join的时候 是大表在左侧 还是小表在左侧(一)
  • 使用POI-TL组件按模板导出word文档