20. TypeScript 的类型映射

在TypeScript中,类型映射(Mapped Types)是一种强大的类型转换工具,它允许我们从旧的类型生成新的类型。本文将介绍类型映射的不同方式和分类,每种映射方法的使用场景,以及详细的示例代码。

基础映射类型

基础映射类型是最简单的映射类型,它通过遍历一个已知的联合类型来创建新类型。

使用场景: 当你需要根据一个联合类型的值来创建对象类型时,基础映射类型非常有用。

// 基础映射类型示例
type Permissions = 'read' | 'write' | 'delete';
type AccessControl = { [K in Permissions]: boolean };

// AccessControl类型等同于:
// {
//   read: boolean;
//   write: boolean;
//   delete: boolean;
// }

条件映射类型

条件映射类型使用条件类型(Conditional Types)来决定如何映射到新的属性类型。

使用场景: 当你需要根据属性的键或现有类型来决定新属性的类型时,条件映射类型非常有用。

// 条件映射类型示例
type Options = 'option1' | 'option2' | 'option3';
type OptionFlags = { [K in Options]: K extends 'option2' ? string : number };

// OptionFlags类型等同于:
// {
//   option1: number;
//   option2: string;
//   option3: number;
// }

通过模板字面量进行映射

模板字面量类型(Template Literal Types)可以与映射类型结合,创建基于字符串模式的类型。

使用场景: 当你需要创建与字符串模式匹配的属性名时,模板字面量映射类型非常有用。

// 模板字面量映射类型示例
type EventNames = 'onClick' | 'onHover' | 'onFocus';
type EventHandlers = { [K in `handle${EventNames}`]: () => void };

// EventHandlers类型等同于:
// {
//   handleonClick: () => void;
//   handleonHover: () => void;
//   handleonFocus: () => void;
// }

使用泛型进行映射

泛型可以与映射类型结合,允许我们创建更通用和可重用的映射类型。

使用场景: 当你需要创建可适用于多种类型的映射类型时,泛型映射类型非常有用。

// 使用泛型进行映射示例
type NullableProperties<T> = { [P in keyof T]: T[P] | null };

// 使用NullableProperties将所有属性变为可空类型
interface User {
  id: number;
  name: string;
}

type NullableUser = NullableProperties<User>;

// NullableUser类型等同于:
// {
//   id: number | null;
//   name: string | null;
// }

映射修饰符

映射类型支持使用修饰符来调整属性的可选性和只读性。

使用场景: 当你需要创建属性的只读版本或可选版本时,映射修饰符非常有用。

// 映射修饰符示例
type Readonly<T> = { readonly [P in keyof T]: T[P] };
type Optional<T> = { [P in keyof T]?: T[P] };

interface Task {
  title: string;
  completed: boolean;
}

type ReadonlyTask = Readonly<Task>;
type OptionalTask = Optional<Task>;

// ReadonlyTask类型等同于:
// {
//   readonly title: string;
//   readonly completed: boolean;
// }

// OptionalTask类型等同于:
// {
//   title?: string;
//   completed?: boolean;
// }

键名重映射

在TypeScript 4.1及以上版本中,类型映射得到了进一步的增强,允许我们通过使用as语法来重新映射键名。这意味着我们可以在创建新类型时改变属性的名称。

使用场景: 当你需要在新的类型中使用不同的属性名时,键名重映射非常有用。

// 键名重映射示例
type MappedTypeWithNewKeys<T> = {
  [K in keyof T as NewKeyType]: T[K]
}

// 示例:将对象中的键名转换为大写
type Options = {
  firstOption: boolean;
  secondOption: boolean;
};

type CapitalizedOptions = {
  [K in keyof Options as Capitalize<K>]: Options[K]
}

// CapitalizedOptions类型等同于:
// {
//   FirstOption: boolean;
//   SecondOption: boolean;
// }

在上面的示例中,我们使用了Capitalize工具类型,它是TypeScript内置的一个条件类型,用于将字符串字面量类型的首字母转换为大写。

进阶应用:我们还可以结合条件类型来有选择性地重映射键名,或者使用模板字面量类型来创建更复杂的键名模式。

// 有选择性地重映射键名
type User = {
  id: number;
  firstName: string;
  lastName: string;
  isAdmin: boolean;
};

type UserWithoutSensitiveInfo = {
  [K in keyof User as Exclude<K, 'isAdmin'>]: User[K]
}

// UserWithoutSensitiveInfo类型等同于:
// {
//   id: number;
//   firstName: string;
//   lastName: string;
// }

// 使用模板字面量类型重映射键名
type PrefixedUser = {
  [K in keyof User as `user_${K}`]: User[K]
}

// PrefixedUser类型等同于:
// {
//   user_id: number;
//   user_firstName: string;
//   user_lastName: string;
//   user_isAdmin: boolean;
// }

通过键名重映射,我们可以创建出更加灵活和丰富的类型定义,这对于处理复杂的数据结构和类型转换非常有帮助。

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

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

相关文章

基于springboot+vue+Mysql的乐校园二手书交易管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

OPPO手机支持深度测试+免深度测试解锁BL+ROOT权限机型整理-2024年3月更新

绿厂OPPO手机线上线下卖的都很不错&#xff0c;目前市场份额十分巨大&#xff0c;用户自然也非常多&#xff0c;而近期ROM乐园后台受到很多关于OPPO手机的私信&#xff0c;咨询哪些机型支持解锁BL&#xff0c;ROOT刷机&#xff0c;今天ROM乐园正式盘点当前市场上可以解BL刷root…

Android图片压缩、Drawable和Bitmap转换、bitmap和base64转换

1. Android图片压缩、Drawable和Bitmap转换、bitmap和base64转换 1.1. Drawable和Bitmap之间的转化 1.1.1. bitmap和Drawable间的区别 Bitmap - 称作位图&#xff0c;一般位图的文件格式后缀为bmp&#xff0c;当然编码器也有很多如RGB565、RGB888。作为一种逐像素的显示对象执…

【YesPMP】众包平台,最新项目

YesPMP平台专注于软件开发领域&#xff0c;是专业的一站式互联网众包平台&#xff0c;目前平台汇聚了上万个解决方案&#xff0c;覆盖全国&#xff0c;拥有众多专业优质的H5开发服务商&#xff0c;专为企业提供软件H5开发解决方案&#xff0c;提高企业的知名度。优秀的H5能为用…

云仓酒庄北京发布会与《综合品酒师》培训的延伸层次分享

原标题&#xff1a;云仓酒庄北京发布会与《综合品酒师》培训近日&#xff0c;云仓酒庄在北京举办了一场盛大的发布会&#xff0c;并近期举行了首届《综合品酒师》培训活动。这一事件不仅引起了业内的广泛关注&#xff0c;更成为了酒类行业专业化、规范化发展的重要里程碑。大世…

[移动端] “viewport“ content=“width=device-width, initial-scale=1.0“ 什么意思

布局视口, 代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Document</title><style>body,html {margin: 0;padding: 0;}.box {width: 200px;height: 200px;background-color: pi…

“无媒体,不活动”,这句话怎么理解?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 “无媒体&#xff0c;不活动”通常指的是在现代社会中&#xff0c;媒体对于各种活动&#xff0c;尤其是公共活动和事件的推广、宣传和影响力是至关重要的。它强调了媒体在塑造公众意识、…

通往AGI路上,DPU将如何构建生成式AI时代的坚实算力基石?

4月19日&#xff0c;在以“重构世界 奔赴未来”为主题的2024中国生成式AI大会上&#xff0c;中科驭数作为DPU新型算力基础设施代表&#xff0c;受邀出席了中国智算中心创新论坛&#xff0c;发表了题为《以网络为中心的AI算力底座构建之路》主题演讲&#xff0c;勾勒出在通往AGI…

Python_AI库 Pandas的数据结构及基本操作

Python_AI库 Pandas的数据结构及基本操作 本文默认读者具备以下技能&#xff1a; 熟悉python基础知识&#xff0c;vscode或其它编辑工具 熟悉表格文件的基本操作 具备自主扩展学习能力 本文篇幅较长&#xff0c;但比较重要&#xff0c;希望读者可以认真看完并实例运行。 Pa…

不可重复读,幻读和脏读

不可重复读一般在读未提交&#xff0c;读已提交这两种隔离级别出现&#xff0c;第一次读和第二次读的数据不一致。 幻读一般在读未提交&#xff0c;读已提交&#xff0c;可重复读出现&#xff0c;原因是第一个事务执行时&#xff0c;第二个事务完成了提交&#xff0c;在第一个…

Xilinx 7系列MMCM/PLL的使用模型

本文展示了MMCM的一些使用模型&#xff08;同样适用于PLL&#xff09;&#xff0c;如时钟网络去偏斜、具有内部反馈的MMCM和零延迟缓冲区等。 1、时钟网络去偏斜&#xff08;Clock Network Deskew&#xff09; MMCM的主要用途之一是用于时钟网络去偏斜。图3-11和图3-12展示了…

SpringCloud中网关-详解、案例(代码)

简介&#xff1a;在Spring Cloud中&#xff0c;网关的角色是非常重要的&#xff0c;它负责整个系统的入口流量&#xff0c;并且可以处理路由、过滤、协议转换等操作 目录 1、网关的技术实现 1.1 网关功能 1.2 网关的形式 2、网关实现步骤 2.1 添加相关依赖 2.2 创建此mod…

获取1年免费的SSL证书

之所以写这篇帖子是因为一直使用的阿里云和腾讯云免费的ssl证书由一年有效期相继改为了3个月&#xff0c;3个月换一次证书想太过麻烦了&#xff0c;还是需要一年有效期的证书更为适合 有两个站点推荐:(本次以FreeSSL为例) .JoySSL一个提供免费HTTPS证书申请的网站 FreeSSL.c…

156.25MHz的差分晶体振荡器SG3225VEN

数字经济正焕发出勃勃生机,云计算,大数据,5G和人工智能等新技术的发展给行业带来了新的机遇。无论是在数据中心内部还是在数据中心之间,提供低成本,高速的100/200/400G小型化解决方案都是光模块的发展需求。为了使DSP稳定工作&#xff0c;需要一个小型的封装晶体振荡器来提供参…

嵌入式学习63-C++

知识零碎&#xff1a; newmalloc friend 友元函数 …

面向对象练习题【从零开始学Java】

Java零基础系列课程-JavaSE基础篇 Lecture&#xff1a;波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。…

nginx修改http为https

Linux运维工具-ywtool 目录 一. 获取 SSL 证书1.安装openssl2.自签名证书 二.安装SSL证书三.配置Nginx支持HTTPS四.重启nginx 一. 获取 SSL 证书 SSL/TLS证书是用来验证服务器身份和提供一个安全的连接通道的 获取SSL/TLS证书有几种方法 1.购买域名,购买SSL证书 2.自签名证书…

[linux网络编程]UDP协议和TCP协议的使用

目录 看以下内容前&#xff0c;你要先了解main函数带参数有什么用、 了解socket的相关函数接口 如果不了解socket的相关函数接口请先看我这篇文章 main函数带参数有什么用 UDP udp_server 1.生成socket文件描述符 2.填充sockaddr_in信息 3.bind 4.发&#xff08;收&…

序列化与反序列化

【一】序列化跟反序列化 # api接口开发&#xff0c;最核心最常见的一个过程就是序列化&#xff0c;所谓序列化就是把数据转换格式&#xff0c;序列化可以分两个阶段&#xff1a;【序列化值的是转换数据格式&#xff1a;序列化&#xff0c;返序列化】# 序列化&#xff1a; 把我们…

使用frp实现内网穿透教程

文章目录 简介frp 是什么&#xff1f;为什么选择 frp&#xff1f; 概念工作原理代理类型 内网穿透教程服务端安装和配置本地Windows&#xff08;客户端&#xff09;安装和配置本地Linux虚拟机&#xff08;客户端&#xff09;安装和配置使用 systemd 管理服务端注意事项 简介 f…
最新文章