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

TypeScript 实用类型深度解析:Partial、Pick、Record 的妙用

需求背景:在后台系统的用户管理模块中,我们常遇到这样的场景:修改用户资料时只需要传部分字段,展示用户列表时要隐藏敏感信息,快速查找用户需要ID索引等等,这些业务需求都可以通过 TypeScript 的实用类型优雅解决。

文章目录

  • 一、`Partial<T>` : 构建灵活更新模型
  • 二、`Pick<T,K>`:精准数据裁剪术
  • 三、`Record<K,T>`:构建类型安全字典
  • 四、实用类型全家桶
  • 五、类型组合的化学效应
  • 六、最佳实践指南

一、Partial<T> : 构建灵活更新模型

实现原理

type MyPartial<T> = {[P in keyof T]?: T[P];
}

通过映射类型遍历所有属性,为每个属性添加 ? 修饰符

典型场景:

// 用户更新表单类型
type UpdateUserForm = Partial<User>;// 使用示例
const updateData: UpdateUserForm = {name: '',email: '',
}

优势:

  • 避免定义重复的 DTO 类型
  • 防止误传未修改的字段
  • 与后端 PATCH 接口完美契合

二、Pick<T,K>:精准数据裁剪术

实现原理:

type MyPick<T, K extends keyof T> = {[P in K] : T[P];
};

通过K限定要保留的属性键集合

实战应用

// 安全返回给前端的基础信息
type PublicUserProfile = Pick<User, 'id' | 'name'>;// 生成用户名片数据
const renderUserCard = (user: PublicUserProfile) => {return `<div>${user.name} (#${user.id})</div>`;
}

延伸技巧:

// 组合使用实现高级类型
type AuditLog = Pick<User, 'id'> & {action: string;timestamp: Date;
}

三、Record<K,T>:构建类型安全字典

实现原理:

type MyRecord<K extends keyof any, T> = {[P in K]: T;
}

约束键的类型必须是有效索引类型(string | number | symbol)
典型应用:

// 用户ID到用户对象的映射
const userCache: Record<number, User> = {1: { id: 1, name: "Alice", email: "alice@example.com" },2: { id: 2, name: "Bob", email: "bob@example.com" }
};// 快速查找用户
const getUser = (id: number) => userCache[id]

高级用法:

// 配置系统多语言字典
type Locale = 'en' | 'zh';
type Messages = Record<Locale, Record<string, string>>;const messages: Messages = {en: { welcome: "Welcome", logout: "Logout" },zh: { welcome: "欢迎", logout: "退出登录" }
};

四、实用类型全家桶

1.Omit<T,K> :反向Pick

type SensitiveUser = Omit<User, 'password' | 'token'>;

2.Readonly<T> :构建不可变对象

const defaultConfig: Readonly<Config> = { /*...*/ };

3.Required<T> :去除所有可选修饰符

type StrictUser = Required<User>; // phone变为必填

五、类型组合的化学效应

// 分页响应通用模板
type PaginatedResponse<T> = {data: T[];total: number;
} & Record<string, unknown>;// 用户搜索过滤器
type UserFilter = Partial<Pick<User, 'name' | 'email'>> & {createTime?: [Date, Date];
};

六、最佳实践指南

  1. 渐进式类型:从 any 开始逐步替换
  2. 类型文档化:重要类型添加注释
/*** 用户核心字段(不含敏感信息)* @property id - 用户唯一标识* @property name - 显示名称*/
type PublicUser = Pick<User, 'id' | 'name'>;
http://www.xdnf.cn/news/2843.html

相关文章:

  • SQL常用数据清洗语句
  • Python爬虫学习路径与实战指南 02
  • 苍穹外卖10
  • React学习
  • Spring系列四:AOP切面编程第四部分
  • 计网分层体系结构(包括OSI,IP,两者对比和相关概念)
  • 免费LUT网站
  • 花费7元训练自己的GPT 2模型
  • 4月28日信息差全景:国际局势、科技突破与市场震荡一、国际政治与安全:俄乌冲突关键转折
  • 利用Python生成Xilinx FPGA ROM IP核 .coe初始化文件
  • Python面试问题
  • 贪心算法-2208.将数组和减半的最小操作数-力扣(LeetCode)
  • 遥控器的智能跟踪与多路径优化模块要点!
  • 【网络编程】TCP/IP四层模型、MAC和IP
  • MySQL 的ANALYZE与 OPTIMIZE命令
  • 使用 ELK 实现全链路追踪:从零到一的实践指南
  • pycharm 配置路径映射 将本地文件映射(mapping)到远程服务器上
  • [Spring] Seata详解
  • Missashe考研日记-day29
  • 6.进程概念(中)
  • 智能指针之设计模式6
  • 项目立项管理
  • Android Studio 安装 Continue插件
  • 数据库中的主键(Primary Key)
  • uni-app vue3 实现72小时倒计时功能
  • css中:is和:where 伪函数
  • Dia-1.6B环境搭建推理测试
  • docker本地部署ClipCascade,实现跨设备剪贴板同步
  • 【大语言模型开发】BPE算法(Byte-Pair)
  • 跨端开发技术总结