TypeScript中的类型映射
类型映射
1. 简介
映射就是将一种类型按照映射规则,转成另一种类型,通常用于对象类型。
这里类型B通过A采用属性名索引的写法,完成了类型B的定义
type A = {foo: number;bar: number;
};type B = {[prop in keyof A]: string;
};
这里复制了一个一样的类型,类型B原样复制了类型A
type A = {foo: number;bar: string;
};type B = {[prop in keyof A]: A[prop];
};
为了增加代码复用性,可以把常用的映射写成泛型。
这里定义了一个泛型,可以将其他对象的所有属性值都改成 boolean 类型。
type ToBoolean<Type> = {[Property in keyof Type]: boolean;
};
不使用联合类型,直接使用某种具体类型进行属性名映射,也是可以的。
type MyObj = {[p in 'foo']: number;
};// 等同于
type MyObj = {foo: number;
};
上面示例中,p in 'foo'可以看成只有一个成员的联合类型,因此得到了只有这一个属性的对象类型。
通过映射,可以把某个对象的所有属性改成可选属性。比如ts 的内置工具类型Partial<T>,就是这样实现的。
type A = {a: string;b: number;
};type B = {[Prop in keyof A]?: A[Prop];
};
上面示例中,类型B在类型A的所有属性名后面添加问号,使得这些属性都变成了可选属性。
ts内置的工具类型Readonly<T>可以将所有属性改为只读属性,实现也是通过映射。
// 将 T 的所有属性改为只读属性
type Readonly<T> = {readonly [P in keyof T]: T[P];
};
// 用法如下。
type T = { a: string; b: number };type ReadonlyT = Readonly<T>;
// {
// readonly a: string;
// readonly b: number;
// }
2. 映射修饰符
映射会原样复制原始对象的可选属性和只读属性,如果想要删除可选和只读这两个特性,并不太方便,所以为了解决这个问题,ts引入了两个修饰符,用来移除映射时添加或移除可选属性或者只读属性。
+修饰符:写成+?或+readonly,为映射属性添加?修饰符或readonly修饰符。–修饰符:写成-?或-readonly,为映射属性移除?修饰符或readonly修饰符。
这里添加、移除了可选属性,+?或-?要写在属性名的后面
// 添加可选属性
type Optional<Type> = {[Prop in keyof Type]+?: Type[Prop];
};// 移除可选属性
type Concrete<Type> = {[Prop in keyof Type]-?: Type[Prop];
};
这里添加、移除只读属性,+readonly和-readonly要写在属性名的前面。
// 添加 readonly
type CreateImmutable<Type> = {+readonly [Prop in keyof Type]: Type[Prop];
};// 移除 readonly
type CreateMutable<Type> = {-readonly [Prop in keyof Type]: Type[Prop];
};
如果同时增删?和readonly这两个修饰符,写成下面这样。
// 增加
type MyObj<T> = {+readonly [P in keyof T]+?: T[P];
};// 移除
type MyObj<T> = {-readonly [P in keyof T]-?: T[P];
}
ts 原生的工具类型Required<T>专门移除可选属性,就是使用-?修饰符实现的。
另外,–?修饰符移除了可选属性以后,该属性就不能等于undefined了,实际变成必选属性了。但是,这个修饰符不会移除null类型。
另外,+?修饰符可以简写成?,+readonly修饰符可以简写成readonly。
3. 键名重映射
1. 语法
ts4.1引入了键名重映射,允许改变键名,就是在键名映射的后面加上as +新类型字句,新类型字句一般是模板字符串,用来对原键名的操作。
type A = {foo: number;bar: number;
};type B = {[p in keyof A as `${p}ID`]: number;
};// 等同于
type B = {fooID: number;barID: number;
};
上面示例中,类型B是类型A的映射,但在映射时把属性名改掉了,在原始属性名后面加上了字符串ID。
可以看到,键名重映射的语法是在键名映射的后面加上as + 新类型子句。这里的“新类型”通常是一个模板字符串,里面可以对原始键名进行各种操作。
2. 属性过滤
键名重映射可以过滤某些属性。
3. 联合类型的映射
因为键名重映射可以修改键名类型,所以原始键名的类型不必是string|number|symbol,任意的联合类型都可以用来进行键名重映射。
type S = {kind: 'square',x: number,y: number,
};type C = {kind: 'circle',radius: number,
};type MyEvents<Events extends { kind: string }> = {[E in Events as E['kind']]: (event: E) => void;
}type Config = MyEvents<S|C>;
// 等同于
type Config = {square: (event:S) => void;circle: (event:C) => void;
}
上面示例中,原始键名的映射是E in Events,这里的Events是两个对象组成的联合类型S|C。所以,E是一个对象,然后再通过键名重映射,得到字符串键名E['kind']。
相关文章:
TypeScript中的类型映射
类型映射 1. 简介 映射就是将一种类型按照映射规则,转成另一种类型,通常用于对象类型。 这里类型B通过A采用属性名索引的写法,完成了类型B的定义 type A {foo: number;bar: number; };type B {[prop in keyof A]: string; };这里复制了一…...
系统平台同一网络下不同设备及进程数据通讯--DDS数据分发服务中间件
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言(1)中间件的介绍(2)DDS介绍(3)发布者(4)订阅者(5)idl文件(定义msg结构体)(6)QoS(Quality of Service)策略(7)DDS测试工具介绍(…...
golang小技巧
1/有时需要把json内容返回给前段进行文本编辑json字段,那么最好是能返回格式化后的json,这样对于用户编辑页方便。这时候可以利用json.MarshalIndent(data, "", "\t")来进行格式化,带有缩进的marshal。 2/对holders的填…...
JavaWeb——IDEA操作:Project最终新建module
在project中创建新的module: 创建一个新的module很容易,但是它可能连接不上Tomcat,因此需要修改一些配置: 将以下地址修改为新module的地址...
前端开发技术栈(工具篇):2023深入了解webpack的安装和使用以及核心概念和启动流程(详细) 63.3k stars
目录 Webpack简介 Entry Module Chunk Loader Plugin Output Webpack的启动流程 Webpack的优缺点 Webpack的使用 1. 安装Webpack 2. 创建Webpack配置文件 3. 编写代码 4. 运行Webpack 5. 在HTML中引入打包后的文件 6. 执行编译命令 Webpack其他功能介绍 1. 使…...
[SQL开发笔记]LIKE操作符:在 WHERE 子句中搜索列中的指定模式
一、功能描述: LIKE操作符:用于在 WHERE 子句中搜索列中的指定模式。 二、LIKE操作符语法详解: LIKE 语法 SELECT column1, column2,…FROM table_nameWHERE column LIKE pattern; 参数说明: (1)colum…...
flutter深研
https://www.douyin.com/video/7020336319058627853 关闭系统风扇 在 Windows 操作系统上安装和配置 Flutter 开发环境 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter...
TypeScript中的declare关键字
declare关键字 1. 简介 declare关键字用来告诉编译器,某个类型是存在的,可以在当前文件中使用。 作用:就是让当前文件可以使用其他文件声明的类型。比如,自己的脚本使用外部库定义的函数,编译器会因为不知道外部函数…...
玫瑰红葡萄酒的基本知识
在过去的几年里,玫瑰红葡萄酒越来越受欢迎,但是如果你是饮用玫瑰红葡萄酒的新手,你可能想知道它是如何从其他红葡萄酒或白葡萄酒中脱颖而出的。 玫瑰红具有标志性的粉色,很难归类,那它是更适合放在红酒类还是属于白酒…...
HTTP 协议参考文档
开发者Web协议文档: https://developer.mozilla.org/zh-CN/docs/Web 其中子节点包含 HTTP 协议内容: https://developer.mozilla.org/zh-CN/docs/Web/HTTP 其内容是基于 markdown 编写的,对应源文件在 Github 中,如下…...
Python遍历删除列表元素的一个奇怪bug
假定有一个Python列表,比如[CFFEX.IF, CFFEX.TS,SHFE.FU],现在需要将其中带‘CFFEX’前缀的所有元素都删除。在使用列表推导式一行代码搞定之前,用了一种最朴素的遍历删除方法,结果出现了意想不到的的问题。复盘了下,结…...
Elasticsearch部署中的两大常见问题及其解决方案
随着大数据和实时搜索的日益普及,Elasticsearch已经成为现代应用中不可或缺的工具。但是,像所有软件一样,部署和配置Elasticsearch可能会遇到一些问题。本文将探讨两个我最近遇到的常见问题及其解决方案。 问题描述 1. 主机名解析问题 在启…...
【计网 CDN】计算机网络 CDN(Content Delivery Network)分布式网络架构详解:中科大郑烇老师笔记 (八)
目录 0 引言1 为什么需要分布式的网络架构?2 视频流化服务2.1 多媒体:视频2.2 存储视频的流化(Streaming)服务2.3 流媒体传输协议:DASH2.4 面临挑战:服务器如何向上百万用户同时提供视频流化内容࿱…...
C# 图解教程 第5版 —— 第9章 表达式和运算符
文章目录 9.1 表达式(*)9.2 字面量9.2.1 整数字面量9.2.2 实数字面量9.2.3 字符字面量9.2.4 字符串字面量 9.3 求值顺序9.3.1 优先级9.3.2 结合性 9.4 简单算术运算符9.5 求余运算符9.6 关系比较运算符和相等比较运算符9.7 递增运算符和递减运算符&#…...
TIA博途_Profinet通信故障诊断及常见错误解决方法汇总
TIA博途_Profinet通信故障诊断及常见错误解决方法汇总 1. 在线诊断报硬件组件的用户数据错误,设备组态不支持 解决方法: (1)检查模块终端盖板; (2)检查组态模块与实际组装模块顺序型号是否一致。 2. 网络视图,设备视图界面显示黑色感叹号 解决方法: PLC转离线,下载硬…...
Windows server部署filebeat到kafka
需求:Windows dhcp日志需要实时传输到elk或者其他告警平台。 1、filebeat下载地址:https://www.elastic.co/cn/downloads/beats/filebeat 2、下载后解压后配置filebeat.yml文件, 3、README.md文件中有运行的操作方法:cmd上进入f…...
Interview of ING internship for master thesis: LLM
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1. Background2. Interview2.1 Intro2.2 project experience2.3 问题2.4 Q&A 总结 Interview of ING internship for master thesis: LLM 1. Background Proje…...
华为校招第三题 找最小数
给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。 示例 1 : 输入:num "1432219", k 3 输出:"1219" 解…...
大数据Flink(一百零三):SQL 表值聚合函数(Table Aggregate Function)
文章目录 SQL 表值聚合函数(Table Aggregate Function) SQL 表值聚合函数(Table Aggregate Function) Python UDTAF,即 Python TableAggregateFunction。Python UDTAF 用来针对一组数据进行聚合运算,比如同一个 window 下的多条数据、或者同一个 key 下的多条数据等,与…...
php+JavaScript实现callback跨域请求jsonp数据
摘要 JSONP 是 JSON with Padding 的缩写,是一种解决跨域数据获取的方案。由于浏览器的同源策略限制,不同域名之间的前端JS代码不能相互访问到对方的数据,JSONP通过script标签的特性,实现在不同域名的网页间传递数据。 其原理是…...
好写作AI“期刊论文智造局”:解锁学术发表的通关秘籍
在学术的江湖里,期刊论文就像是一把把锋利的宝剑,是学者们披荆斩棘、开疆拓土的得力武器。然而,想要打造出一把称手的“宝剑”,从选题到撰写,再到格式调整,每一步都充满挑战。别愁啦!好写作AI化…...
嵌入式Linux驱动开发全攻略
1. 嵌入式Linux驱动开发全景解析 从事嵌入式开发多年,我深刻体会到驱动开发是整个嵌入式系统中最为关键也最具挑战性的部分。它像一座桥梁,连接着冰冷的硬件和灵活多变的软件世界。今天,我将从实际工程角度,系统梳理嵌入式Linux驱…...
技术赋能B端拓客:号码核验行业的迭代与价值升级
2026年,数字经济高质量发展进入深水区,B端市场的竞争逻辑已从“规模制胜”转向“效能突围”,拓客环节的精细化、高效化成为企业构建核心竞争力的关键。号码核验作为B端拓客的前置基础性环节,直接关联线索质量、人力效能与拓客投入…...
计算机毕业设计:Python智能汽车销量分析预测平台 Flask框架 scikit-learn 可视化 requests爬虫 AI 大模型(建议收藏)✅
博主介绍:✌全网粉丝50W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战8年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...
c++入门:函数实参形参傻傻分不清?如何改变实参!
值传递是 C 中最基本的参数传递方式。它的核心意思是:当你把一个变量作为参数传给函数时,函数得到的是这个变量的一个副本,而不是变量本身。所以在函数内部修改这个副本,外部的原变量纹丝不动。📦 举个生活例子你把一张…...
Python数据可视化入门:从零开始掌握三大核心库
在数据科学领域,数据可视化是连接数据与洞见的关键桥梁。通过图表和图形,我们能够直观地理解数据模式、发现异常值、并向他人清晰传达分析结果。Python作为数据分析的主流语言,提供了丰富强大的可视化工具库。本文将带你从零开始,…...
暗黑破坏神2存档修改神器:从入门到精通的完整指南
暗黑破坏神2存档修改神器:从入门到精通的完整指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 如果你是暗黑破坏神2的忠实玩家,一定遇到过反复刷装备的枯燥、角色培养的漫长过程。d2s-editor作为一款强…...
告别重复输入:快马助你打造高效openclaw命令管理工具
最近在团队协作中频繁使用openclaw工具时,发现每次手动输入冗长的命令参数特别容易出错,尤其是当需要切换不同环境配置时,常常因为输错一个参数导致整个流程卡住。于是决定用Python开发一个小工具来提升操作效率,顺便把实现过程记…...
如何突破AI编程工具限制?三大核心方案助你效率倍增
如何突破AI编程工具限制?三大核心方案助你效率倍增 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial …...
DeepLabV3+语义分割环境配置、DeepLabV3+语义分割模型代跑训练、DeepLabV3+语义分割模型改进创新DeepLabV3+语义分割环境配置:Windows、Ubuntu、Cen
DeepLabV3语义分割环境配置、 DeepLabV3语义分割模型代跑训练、 DeepLabV3语义分割模型改进创新 DeepLabV3语义分割环境配置:Windows、Ubuntu、Centos、Macos等系统环境,如果电脑拥有显卡,可配置GPU版本的DeepLabV3语义分割环境。 DeepLabV3语…...
