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

TypeScript:内置高级类型

        在实际项目(如 React、Angular 或 Vue 应用)中经常使用 TypeScript 的高级类型来提升代码的类型安全性和可维护性。这些内置类型基于 TypeScript 的映射类型(Mapped Types)实现,能帮助我们高效地操作对象类型。下面我将有逻辑地详细讲解 PartialPickReadonly Record,并结合前端场景示例说明其用法和价值。

1. Partial

  • 定义与作用Partial 创建一个新类型,该类型将 T 的所有属性都设为可选(即每个属性添加 ? 修饰符)。它本质上是一个映射类型:type Partial = { [P in keyof T]?: T[P]; }

  • 核心逻辑:通过遍历 T 的所有属性键(keyof T),并为每个属性添加可选标记,避免强制要求所有属性必须存在。

  • 前端应用场景:在表单处理或 API 请求中非常有用。例如,在 React 中更新状态时,你可能只需要修改对象的部分属性:

interface User {id: number;name: string;email: string;
}// 使用 Partial 允许只传入部分属性
const updateUser = (updateData: Partial<User>)=>{// 逻辑代码...
};// 调用时可只传部分字段
updateUser({ name: "张三" }); // 合法,无需提供所有属性
  • 优点:提升代码灵活性,减少样板代码,避免因遗漏属性导致的错误。

2. Pick

  • 定义与作用Pick 从类型 T 中选择指定的一组属性键 K(必须是 T 的键的子集),创建一个新类型。类型定义为:type Pick = { [P in K]: T[P]; }

  • 核心逻辑:通过指定键集合 K,只保留 T 中这些键对应的属性,其他属性被忽略。

  • 前端应用场景:在组件 props 或状态管理中,用于精简类型。例如,在 React 组件中,你可能只需要父组件传递特定属性:


import React from 'react'; // 确保导入Reactinterface Product {id: number;name: string;price: number;description: string;
}// 使用 Pick 只选择需要的属性
type ProductSummary = Pick<Product, 'id' | 'name' | 'price'>;// 正确的组件定义方式
const ProductCard: React.FC<ProductSummary> = ({ id, name, price }) => {// 显示产品摘要return <div key={ id }> { name } - ${ price } </div>;
};// 或者使用函数表达式方式
const ProductCard = ({ id, name, price }: ProductSummary) => {return <div key={ id }> { name } - ${ price } </div>;
};
  • 优点:提高组件重用性和类型约束精确度,减少不必要的属性传递。

3. Readonly

  • 定义与作用Readonly 创建一个新类型,该类型将 T 的所有属性设为只读(即添加 readonly 修饰符)。类型定义为:type Readonly = { readonly [P in keyof T]: T[P]; }

  • 核心逻辑:遍历 T 的每个属性,添加 readonly 关键字,确保属性值在创建后不可修改。

  • 前端应用场景:适用于不可变数据,如 Redux 状态或配置对象。在 React 中,防止意外修改 props 或状态:


interface AppConfig {apiUrl: string;theme: 'light' | 'dark';
}// 使用 Readonly 确保配置不被修改
const config: Readonly<AppConfig> = {apiUrl: 'https://api.example.com',theme: 'light',
};// config.apiUrl = 'https://new-api.com'; // 错误: 无法分配给只读属性
// 在函数参数中使用
const initializeApp = (config: Readonly<AppConfig>) => {// 安全读取 config,防止内部修改
};
  • 优点:增强不可变性,避免副作用,提升并发安全性。

4. Record

  • 定义与作用Record 创建一个对象类型,其中键为类型 K(通常是字符串或数字联合类型),值为类型 T。类型定义为:type Record = { [P in K]: T; }

  • 核心逻辑:映射键集合 K 到统一的值类型 T,常用于动态键值结构。

  • 前端应用场景:在字典或映射数据时非常高效,如国际化文案或状态映射。例如,在 Vue React 中管理错误消息:

// 定义错误代码类型
type ErrorCode = '404' | '500' | '403';// 使用 Record 创建错误消息映射
const errorMessages: Record<ErrorCode, string> = {'404': '页面未找到','500': '服务器错误','403': '权限不足',
};// 在组件中使用
const getErrorMessage = (code: ErrorCode) => errorMessages[code];// 也适用于 API 响应映射
type UserRoles = 'admin' | 'user';
const rolePermissions: Record<UserRoles, string[]> = {admin: ['create', 'delete'],user: ['read'],
};
  • 优点:简化动态对象的类型声明,确保键值一致性,提升代码可读性。

总结

  • 共同点:这些高级类型都基于映射类型机制,通过遍历和转换现有类型来创建新类型,增强了 TypeScript 的类型操作能力。它们与泛型结合,能灵活适配多种场景。

  • 前端价值

    • 提升类型安全:减少运行时错误,如在表单验证或状态管理中捕获类型问题。

    • 优化代码维护:通过精简或扩展类型,降低重复代码,尤其在大规模项目中。

    • 增强开发效率:IDE 提示更精确,重构更可靠。

  • 最佳实践:在 React props、Redux reducers 或 API 接口定义中优先使用这些类型。例如,结合 Partial 处理可选更新,Record 管理配置字典。

  • 局限与注意:过度使用可能导致类型复杂性增加;需确保键约束正确(如 keyof T)。


文章转载自:

http://LOlsJXSY.wngpq.cn
http://WsFYU1E9.wngpq.cn
http://QNgqXuAM.wngpq.cn
http://MT826pzU.wngpq.cn
http://ckcdRLKl.wngpq.cn
http://mfseIpGk.wngpq.cn
http://WGfiZ5nB.wngpq.cn
http://vyfbpFew.wngpq.cn
http://nWBBlRkq.wngpq.cn
http://Ab9FXxoQ.wngpq.cn
http://pUalaLce.wngpq.cn
http://QIENZlc0.wngpq.cn
http://UlHKl9gz.wngpq.cn
http://amQseIUD.wngpq.cn
http://8PnIlG0Q.wngpq.cn
http://NgckwGzM.wngpq.cn
http://Nrj7BYRU.wngpq.cn
http://7zcOHrY1.wngpq.cn
http://LysCToCy.wngpq.cn
http://tTDRYzSf.wngpq.cn
http://0VDFqRpT.wngpq.cn
http://I8yfv2XV.wngpq.cn
http://lz6ngNLb.wngpq.cn
http://zrbj4AM7.wngpq.cn
http://WdXDoOT5.wngpq.cn
http://kBvZAslk.wngpq.cn
http://iIYX4hCl.wngpq.cn
http://MU3gRxUo.wngpq.cn
http://dQdQOITC.wngpq.cn
http://aSmUxXSu.wngpq.cn
http://www.dtcms.com/a/363638.html

相关文章:

  • vue2 跟 vue3 对比总结
  • Java集合遍历的方法有哪些
  • T40N君正/INGENIC专业嵌入式CPU计算能力,集成XBurst2双核处理器(1.2GHz)、RISC-V协处理器和神经网络加速器(2TOPS算力)
  • 在 macOS 下升级 Python 几种常见的方法
  • 【LeetCode数据结构】栈和队列的应用
  • 洛谷P3811 【模板】模意义下的乘法逆元
  • 硬件开发1-51单片机1
  • 嵌入式 - 硬件:51单片机
  • LeetCode算法日记 - Day 29: 重排链表、合并 K 个升序链表
  • HTML第三课:特殊元素
  • CICD实战(3) - 使用Arbess+GitLab+Hadess实现Java项目构建/上传制品库
  • 人工智能之数学基础:分布函数对随机变量的概率分布情况进行刻画
  • PromptHero-最受欢迎的AI提示词网站
  • TIOBE 8月编程语言榜深度解析:Python占比突破26%,Perl成最大黑马
  • 【3D打印】3D打印机首次使用心得
  • Git相关的命令
  • 力扣hot100:缺失的第一个正数(哈希思想)(41)
  • 领导层必看:Curtain e-locker为您轻松管理“文件外发“
  • MySQL 多表查询方法
  • day42-单片机
  • 基于3dtitle模型无法双面渲染问题
  • 友思特案例 | 食品行业视觉检测案例集锦(三)
  • 实验4-HTTP协议的运行过程
  • 失业落伍前端, 尝试了一个月 ai 协助编程的真实感受
  • Vscode + docker + qt 网络监听小工具
  • 25.9.2_CTF_reverse_TEA算法
  • 项目解析:技术实现与面试高频问题
  • 交叉熵损失函数
  • 一文读懂 Python 【循环语句】:从基础到实战,效率提升指南
  • 零构建的快感!dagger.js 与 React Hooks 实现对比,谁更优雅?