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

相关文章

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

C# WebAPI的几种返回类型方式

《C#WebAPI的几种返回类型方式》本文主要介绍了C#WebAPI的几种返回类型方式,包括直接返回指定类型、返回IActionResult实例和返回ActionResult,文中通过示例代码介绍的... 目录创建 Controller 和 Model 类在 Action 中返回 指定类型在 Action

GO语言zap日志库理解和使用方法示例

《GO语言zap日志库理解和使用方法示例》Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,:本文主要介绍GO语言zap日志库理解和使用方法的相关资... 目录1. zap日志库介绍2.安装zap库3.配置日志记录器3.1 Logger3.2 Sugared

深入理解Redis线程模型的原理及使用

《深入理解Redis线程模型的原理及使用》Redis的线程模型整体还是多线程的,只是后台执行指令的核心线程是单线程的,整个线程模型可以理解为还是以单线程为主,基于这种单线程为主的线程模型,不同客户端的... 目录1 Redis是单线程www.chinasem.cn还是多线程2 Redis如何保证指令原子性2.

深入理解MySQL流模式

《深入理解MySQL流模式》MySQL的Binlog流模式是一种实时读取二进制日志的技术,允许下游系统几乎无延迟地获取数据库变更事件,适用于需要极低延迟复制的场景,感兴趣的可以了解一下... 目录核心概念一句话总结1. 背景知识:什么是 Binlog?2. 传统方式 vs. 流模式传统文件方式 (非流式)流

深入理解Go之==的使用

《深入理解Go之==的使用》本文主要介绍了深入理解Go之==的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录概述类型基本类型复合类型引用类型接口类型使用type定义的类型不可比较性谈谈map总结概述相信==判等操作,大

python中的鸭子类型详解

《python中的鸭子类型详解》鸭子类型是Python动态类型系统的灵魂,它通过强调“行为”而非“类型”,赋予了代码极大的灵活性和表现力,本文给大家详细介绍python中的鸭子类型,感兴趣的朋友一起看... 目录1. 核心思想:什么是鸭子类型?2. 与“传统”静态类型语言的对比3. python 中无处不在

Java枚举类型深度详解

《Java枚举类型深度详解》Java的枚举类型(enum)是一种强大的工具,它不仅可以让你的代码更简洁、可读,而且通过类型安全、常量集合、方法重写和接口实现等特性,使得枚举在很多场景下都非常有用,本文... 目录前言1. enum关键字的使用:定义枚举类型什么是枚举类型?如何定义枚举类型?使用枚举类型:2.

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)