Typescript高级: 深入理解Omit类型和Pick类型

2024-06-02 19:12

本文主要是介绍Typescript高级: 深入理解Omit类型和Pick类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

  • Omit 是一个非常实用的工具类型,它的功能是从一个已知的对象类型中排除某些属性,并返回一个新的对象类型
  • 这在处理复杂对象结构、实现更严格的类型限制时非常有用
  • Pick 的工作原理基于 TypeScript 的映射类型
  • 当我们使用 Pick<T, K> 时,TypeScript 会遍历 K 中的每一个属性
  • 并在新的类型中创建一个同名的属性
  • 其类型与原始类型 T 中的对应属性相同

Omit 用法

1 )基本语法

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
  • Omit 并没有内置在标准库中,但我们可以很容易地定义它,如上
  • 这里我们使用了另外两个工具类型:Pick 和 Exclude
  • Pick 用于从一个对象类型中选择某些属性
  • 而 Exclude 则用于从一个类型中排除某些属性

2 )使用示例

type UserInfo = {  id: number;  name: string;  email: string;  password: string;  
};type UserInfoWithoutPassword = Omit<UserInfo, 'password'>;  // 相当于:  
// type UserInfoWithoutPassword = {  
//   id: number;  
//   name: string;  
//   email: string;  
// };
  • 这里,我们想创建一个不包含密码的用户信息类型,我们可以使用 Omit

Omit 工作原理

  • Omit 的工作原理基于 TypeScript 的类型操作和映射类型(Mapped Types)
  • 当我们使用 Omit<T, K> 时,TypeScript 会执行以下步骤:
    • 解析 keyof T:获取类型 T 的所有属性键的联合类型
    • 使用 Exclude<keyof T, K>:从 keyof T 中排除 K 指定的属性键
    • 使用 Pick<T, ...>:基于排除后的属性键集合,从 T 中选择对应的属性,并生成一个新的类型

高级用法

  • 除了基本的用法之外,Omit 还可以与其他工具类型结合使用,以实现更复杂的类型操作

  • 例如,我们可以使用 Omit 与 Partial 结合,来创建一个类型,其中的某些属性是可选的,而其他属性则是必需的

    type PartialUserInfo = Partial<Omit<UserInfo, 'id'>>;
    // 相当于:
    // type PartialUserInfo = {
    //   name?: string;
    //   email?: string;
    //   password?: string;
    // };
    
  • 在上面这个例子中,除了 id 属性之外的所有属性都变成了可选的

Pick 概述

  • 在 TypeScript 的类型系统中,工具类型(Utility Types)为我们提供了一系列预定义的、可重用的类型转换机制
  • 其中,Pick 是这些工具类型中非常实用且基础的一个,它允许我们从现有的类型中选择出一部分属性来创建一个新的类型
  • Pick 工具类型接受两个类型参数:第一个参数 T 是我们要从中选择属性的原始类型,第二个参数 K 是 T 类型中属性的子集,这些属性将被包含在生成的新类型中

Pick 基本语法

type Pick<T, K extends keyof T> = {[P in K]: T[P];
};
  • 这里使用了 TypeScript 的映射类型(Mapped Types)语法
  • [P in K]: T[P]; 表示对于 K 中的每一个属性 P,都将其复制到新类型中
  • 并且其类型与原始类型 T 中的对应属性相同

使用示例

  • 假设我们有一个 Person 类型,它包含了多个属性:
    type Person = {name: string;age: number;address: string;phoneNumber: string;
    };type PersonDetails = Pick<Person, 'name' | 'age'>;// 相当于:  
    // type PersonDetails = {  
    //     name: string;  
    //     age: number;  
    // };
    

Pick 工作原理

  • Pick 的工作原理基于 TypeScript 的映射类型
  • 当我们使用 Pick<T, K> 时,TypeScript 会遍历 K 中的每一个属性
  • 并在新的类型中创建一个同名的属性, 其类型与原始类型 T 中的对应属性相同

Pick 高级用法

  • 除了基本的用法之外,Pick 还可以与其他工具类型结合使用
  • 以实现更复杂的类型操作

1 ) 与 Omit 结合使用

  • 我们可以先使用 Pick 选择出需要的属性
  • 然后再使用 Omit 排除掉不需要的属性
  • 虽然直接使用 Pick 就可以达到目的
  • 但有时候这样的组合能更清晰地表达我们的意图
type PersonWithoutAddress = Omit<Person, 'address'>;  
// 或者使用 Pick 和 Exclude 来达到相同的效果  
type PersonWithoutAddressAlternative = Pick<Person, Exclude<keyof Person, 'address'>>;

2 ) 与条件类型结合使用

type IncludePhoneNumber<T extends Person, Include extends boolean> =   Include extends true ? Pick<T, 'phoneNumber' | keyof Omit<T, 'phoneNumber'>> : Omit<T, 'phoneNumber'>;  // 使用示例  
type PersonWithPhone = IncludePhoneNumber<Person, true>; // 包含 phoneNumber  
type PersonWithoutPhone = IncludePhoneNumber<Person, false>; // 不包含 phoneNumber
  • 还可以将 Pick 与条件类型(Conditional Types)结合使用

  • 根据某些条件来动态地选择属性

  • 在这个例子中,我们定义了一个泛型工具类型 IncludePhoneNumber

  • 它接受一个 Person 类型的扩展和一个布尔值 Include

  • 根据 Include 的值,我们使用 Pick 或 Omit 来决定是否包含 phoneNumber 属性

  • 总结

    • Pick 是 TypeScript 中一个非常基础和实用的工具类型
    • 它允许我们轻松地从现有的类型中选择出部分属性来创建新的类型
    • 通过深入了解其背后的原理和使用方法
    • 我们可以更加灵活地处理复杂的类型结构
    • 提高代码的可读性和可维护性
    • 在实际开发中,我们可以结合其他工具类型
    • 如 Omit、条件类型等,来实现更复杂的类型操作

这篇关于Typescript高级: 深入理解Omit类型和Pick类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1024842

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。