TypeScript中的数据选择艺术:pick和omit操作入门

引言
  • 标题:TypeScript中的数据选择艺术:pick和omit操作入门
  • 简短介绍:探索TypeScript中的实用工具类型PickOmit,它们可以帮助你从现有类型中选择或排除属性,简化你的代码并提高类型安全性。
背景知识
  • 易于理解的解释:在JavaScript和TypeScript中,经常需要从对象中提取或忽略某些属性。PickOmit是TypeScript提供的工具类型,用于实现这一目的。
核心概念
  • Pick:从现有类型中挑选出特定的属性,创建一个只包含这些属性的新类型。
  • Omit:从现有类型中排除指定的属性,创建一个不包含这些属性的新类型。
简单示例
  • Pick 示例
interface Person {
  name: string;
  age: number;
  email: string;
}

type PersonName = Pick<Person, 'name'>; // 创建一个只包含name属性的类型

const getNames = (person: PersonName) => {
  return person.name;
};
  • Omit 示例
interface Person {
  name: string;
  age: number;
  email: string;
}

type PersonWithoutAge = Omit<Person, 'age'>; // 创建一个不包含age属性的类型

const getPersonDetails = ({ name, email }: PersonWithoutAge) => {
  return `${name}, ${email}`;
};
深入理解
  • 工作原理PickOmit通过泛型接受两个参数:一个类型和一个属性键的联合,然后分别返回包含或排除这些属性键的新类型。
实际应用
  • 案例研究:在一个用户信息管理系统中,使用Pick来创建一个只包含必要信息的类型,以及使用Omit来创建一个不含敏感信息的类型。
实际用例:用户信息处理
1. 基础的PickOmit使用

场景:假设我们有一个用户信息对象,我们只想要提取出用户的姓名和邮箱。

  • 使用Pick
interface User {
  name: string;
  age: number;
  email: string;
}

// 使用Pick来创建一个只包含name和email的类型
type UserBasicInfo = Pick<User, 'name' | 'email'>;

const printUserBasicInfo = ({ name, email }: UserBasicInfo): void => {
  console.log(`Name: ${name}, Email: ${email}`);
};

const user: User = {
  name: "John Doe",
  age: 30,
  email: "john.doe@example.com"
};

printUserBasicInfo(user); // 正确调用,因为user包含所需的name和email属性
  • 使用Omit
// 使用Omit来创建一个排除age属性的用户信息类型
type UserWithoutAge = Omit<User, 'age'>;

const printUserWithoutAge = ({ name, email }: UserWithoutAge) => {
  console.log(`Name: ${name}, Email: ${email}`);
};

printUserWithoutAge(user); // 正确调用,因为已经排除了age属性
2. 条件渲染中的PickOmit

场景:在一个用户界面中,根据用户的角色,我们可能需要渲染不同的信息。

  • 使用Pick
interface User {
  name: string;
  age: number;
  email: string;
  role: string;
}

// 管理员需要查看所有信息
type AdminUserDetails = Pick<User, 'name' | 'age' | 'email'>;

// 普通用户只能查看名字和邮箱
type RegularUserDetails = Pick<User, 'name' | 'email'>;

const renderUserDetails = (user: User, isUserAdmin: boolean) => {
  if (isUserAdmin) {
    // 管理员可以查看所有信息
    const adminDetails: AdminUserDetails = {
      name: user.name,
      age: user.age,
      email: user.email
    };
    console.log(adminDetails);
  } else {
    // 普通用户只能查看部分信息
    const regularDetails: RegularUserDetails = {
      name: user.name,
      email: user.email
    };
    console.log(regularDetails);
  }
};
3. 接口的扩展和重构

场景:随着时间推移,我们可能需要对用户信息进行扩展或重构。

  • 使用PickOmit进行重构
interface UserV1 {
  name: string;
  age: number;
  email: string;
  address: string;
}

// 假设我们需要创建一个新的接口UserV2,它不包含address属性
interface UserV2 extends Omit<UserV1, 'address'> {
  phone: string;
}

const migrateUserV1toV2 = (userV1: UserV1): UserV2 => {
  return {
    ...userV1,
    phone: "123-456-7890" // 假设这是新添加的电话号码
  };
};
4. 高级用例:函数重构和类型保护

场景:在大型应用程序中,我们可能需要重构函数以接受更少的参数,同时保持类型安全。

  • 使用Pick进行函数重构
function sendWelcomeEmail(user: User) {
  // 发送欢迎邮件的逻辑
}

// 假设我们只需要名字和邮箱来发送邮件
type SendWelcomeEmailParams = Pick<User, 'name' | 'email'>;

// 重构函数以使用新的参数类型
function sendWelcomeEmailRefactored(user: SendWelcomeEmailParams) {
  sendWelcomeEmail(user as User); // 由于SendWelcomeEmailParams是User的子集,这是安全的
}

const user: User = {
  name: "Jane Doe",
  age: 25,
  email: "jane.doe@example.com",
  address: "123 Main St"
};

sendWelcomeEmailRefactored(user); // 现在只需要提供name和email
常见问题
  • FAQs
    • Q: 除了属性名,我可以传递复杂表达式给PickOmit吗?
      A: 不可以,这些操作符只接受属性键的直接列表作为泛型参数。
    • Q: PickOmit会影响原有类型吗?
      A: 不会,它们只会基于原有类型创建新类型,原有类型保持不变。
学习资源
  • 推荐阅读:TypeScript官方文档中关于PickOmit的部分。
互动环节
  • 提问:你如何在项目中使用PickOmit?请在评论区分享你的经验。
结语
  • 总结:通过今天的学习,我们了解了如何使用PickOmit来创建更精确的类型,从而提高代码的可读性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/602045.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

目标检测CNN 目标检测发展历程 应用场景 智慧交通 自动驾驶 工业生产 智慧医疗

目标检测 目标检测是计算机视觉领域中的一个重要任务,其主要目的是让计算机能够自动识别图像或视频帧中所有目标的类别,并在目标周围绘制边界框以标示出每个目标的位置。 目标检测的过程通常包括两个主要步骤:目标定位和目标分类。目标定位是确定图像中是否存在感兴趣的目…

【功耗问题排查】

一、如何处理具体功耗case 在手机功耗测试中&#xff0c;因为我们在功耗测试中&#xff08;电源电压&#xff09;为固定值&#xff08;老手机一般为3.8V左右&#xff0c;现在的大多项目采用4V左右&#xff09;&#xff0c;那么的大小直接由决定&#xff0c;所以&#xff0c;在沟…

在线音视频下载

https://cobalt.tools/ 支持 bilibili 等网站

顺序表的实现(迈入数据结构的大门)(1)

上一节我们认识到了什么是数据结构 这一节我们就来实现第一个数据结构的实现 思考一个问题&#xff1a; 假定一个数组&#xff0c;空间为10&#xff0c;已经使用了5个&#xff0c;向其中插入数据的步骤&#xff1a; 1.插入数据&#xff0c;我们先要求数组长度&#xff0c;其…

做抖音小店怎么选品?这几种实用性选品方式,新手一看就会

大家好&#xff0c;我是电商笨笨熊 做抖音小店&#xff0c;最重要的是选品&#xff0c;最让玩家头疼的还是选品。 选品该怎么选才能选中爆品&#xff0c;怎么做才能让店铺爆单&#xff1f; 笨笨熊做抖店已经四年多的时间&#xff0c;因此也总结出来一套最适合新手玩家去做的…

Stable Diffusion 指定模型,Lora 训练全流程

简介 在使用 Stable Diffusion 的时候&#xff0c;可以选择别人训练好的 Lora&#xff0c;那么如何训练自己的 Lora呢&#xff1f; 本篇文章介绍了如何训练Lora&#xff0c;如何筛选模型&#xff0c;如何在 Stable Diffusion 中使用。 闲话不多说&#xff0c;直接实际操作吧。…

【EI会议|投稿优惠】2024年物理化学与应用数学国际会议(IACPCAM 2024)

2024 International Conference on Physical Chemistry and Applied Mathematics 一、大会信息 会议名称&#xff1a;2024年物理化学与应用数学国际会议会议简称&#xff1a;IACPCAM 2024收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等会议官网&#xff1a;…

Debian——安装syzkaller——2024

系统:Debian 远程连接——我是不想安装tools没有办法复制黏贴,所以远程,根据个人情况选择是否远程连接 就是说使用Windows自带的远程mstsc,使用的不是ssh22端口,是TCP 3389端口 mkdir debian cd debian 二:安装go编译器 打开终端。使用wget命令从官方网站或可信的镜像…

SAP-ABAP-视图

1、什么是视图&#xff1f; 当需要查询多个表中的某些字段的数据时&#xff0c;就可以使用视图。视图不影响数据库中的数据&#xff0c;仅作为查询手段或工具。 2、视图类型&#xff1a; 数据库视图和维护视图经常使用。 3、创建视图SE11 3.1、数据库视图 可以直接输入表名…

js实现json数据可编辑

背景 项目中有低代码平台&#xff0c;由于历史脏数据和非同步编辑的问题&#xff0c;偶尔会出现数据错乱的问题&#xff0c;希望有一个快捷的方式修改数据 之前在用Formily的时候有注意到designable/react 里面的json数据编辑功能非常不错如果能应用到项目里就完美了 design…

UE灯光:点光和聚光灯的强度单位(cd、lm)

在虚幻引擎&#xff08;UE&#xff09;中&#xff0c;点光和聚光灯的光强使用两种不同的单位进行度量&#xff1a; 坎德拉&#xff08;cd&#xff09;&#xff1a;坎德拉是光强度的国际单位&#xff08;SI单位&#xff09;。它代表光源在特定方向上每单位立体角发出的光通量。…

Chromium编译指南2024 Windows11篇-获取 Chromium 的源代码(五)

前言 在《Chromium编译指南2024&#xff08;四&#xff09;》中&#xff0c;我们完成了Git 的初始化配置。 现在&#xff0c;我们将进一步讨论如何获取 Chromium 的源代码&#xff0c;并准备构建所需的文件。 1. 获取Chromium的源代码 在合适的位置准备一个文件夹&#xff…

47. UE5 RPG 实现角色死亡效果

在上一篇文章中&#xff0c;我们实现了敌人受到攻击后会播放受击动画&#xff0c;并且还给角色设置了受击标签。并在角色受击时&#xff0c;在角色身上挂上受击标签&#xff0c;在c里&#xff0c;如果挂载了此标签&#xff0c;速度将降为0 。 受击有了&#xff0c;接下来我们将…

PDF批量编辑技巧:高效PDF转txt批量处理,轻松管理大量文档

随着信息技术的飞速发展&#xff0c;文档管理已成为日常工作中不可或缺的一部分。特别是当我们需要处理大量的PDF文件时&#xff0c;如何高效地进行编辑、转换和管理成为了一个重要的问题。本文将介绍一些PDF批量编辑的技巧&#xff0c;特别是如何将PDF批量转换为txt格式&#…

C语言——文件描述符、系统调用操作文件

文件描述符 在Unix-like操作系统中&#xff0c;文件描述符&#xff08;file descriptor&#xff09;是一个用于标识打开文件或I/O设备的整数值。它是对底层文件系统的抽象&#xff0c;用于在应用程序和操作系统之间传递文件信息。 文件描述符是一个非负整数&#xff0c;通常是…

【MsSQL】数据库基础 库的基本操作

目录 一&#xff0c;数据库基础 1&#xff0c;什么是数据库 2&#xff0c;主流的数据库 3&#xff0c;连接服务器 4&#xff0c;服务器&#xff0c;数据库&#xff0c;表关系 5&#xff0c;使用案例 二&#xff0c;库的操作 1&#xff0c;创建数据库 2&#xff0c;创建…

抖音小店是什么?为什么要去做呢?这几点原因告诉你真相!

大家好&#xff0c;我是电商小V 抖音小店就是抖音平台进军电商行业的踏板&#xff0c;也是抖音内的电商购物业务&#xff0c;咱们就可以理解成可以在抖音平台上面卖货&#xff0c;和淘宝&#xff0c;多多店铺&#xff0c;线下超市都是一个性质的&#xff0c;但是运营的模式不同…

虚拟机镜像文件qcow2格式转vmdk

一、在esxi上虚拟机导出qcow2镜像文件 1、卸载数据盘、网卡 2、登录虚拟机所在物理服务器&#xff0c;查找系统盘名为vm-101-disk-0的文件位置 find / -name "vm-101-disk-0"使用命令导出qcow2镜像&#xff08;进度条走完就完成了&#xff09;&#xff1a; qemu…

ROS服务器通信

目录 一、角色 二、流程 注意 三、例子描述 四、srv文件 编译配置文件 vscode配置 五、Server.cpp编写例子 编写CMakeList 六、观察server的效果 七、Client编写例子 编写CMakeList 八、观察Client的结果 九、Client优化&#xff08;动态输入&#xff09; 了解argc…

linux之ssh

SSH远程连接协议 SSH远程管理 定义 SSH&#xff08;Secure Shell &#xff09;是一种安全通道协议&#xff0c;主要用来实现字符界面的远程的登录、远程复制等功能。 SSH协议对通信双方的数据传输进行了加密处理&#xff0c;其中包括用户登录时输入的用户口令。因此SSH协议具…
最新文章