TypeScript类型体操--Uniq

大家好,我是苏先生,一名热爱钻研、乐于分享的前端工程师,跟大家分享一句我很喜欢的话:人活着,其实就是一种心态,你若觉得快乐,幸福便无处不在

github与好文

前言

前边九篇文章我们一共实现了37 个工具类型,按照本专栏的规划,还差62个...

本节我们继续学习一个新的工具类型

提示

对于语法层面的知识点本系列(类型体操开头的标题)不会展开说明哈,可以自行搜索学习其他大佬的优质文章或者等我后续更新补充

版本一

首先创建一个工具类型,它的名称是Uniq。并且,它接收一个类型为数组的泛型参数T

ts 复制代码
type Uniq<T extends any[]>

由于去重的隐式条件是一一比较,所以我们要提取出数组中的成员,这是参与比较的前提。为了达到这个目的,又需要构建条件类型,因为这是使用infer提取成员的充要条件

ts 复制代码
T extends [infer F,...infer R] ? 'A' : 'B'

现在得到了成员F,下一步就是找它的比较量,由于数组T的成员数是动态且未知的,所以要有一种类似JavaScript中的every的遍历方式依次取出每一个成员,这样就能与F比较来确定是否是重复元素了。这在TypeScript中可以通过extends加索引的方式来实现

ts 复制代码
F extends R[number]

此时,如果条件成立,则说明F重复,只需要将其丢掉后对剩余的R进行递归即可

ts 复制代码
Uniq<R>

相应的,若为false,则保留F,并继续对R递归去重即可

ts 复制代码
[F,...Uniq<R>]

故,使用示例如下

版本二

版本一很好的完成了需求,但有一点小小的问题,那就是,Uniq执行过后的结果的元素顺序发生了变化。如下,1在原数组中的位置应该在5的前边

所以,我们换种思路,通过声明变量的方式来做。如下,笔者新增了泛型参数P,它默认为空数组。并且它表示不重复的成员集合

ts 复制代码
type Uniq<T extends any[],P extends any[] = []>

接着,还是去取数组成员F

ts 复制代码
[infer F,...infer R]

不过这次,我们不再从R中查找了,而是从P中对比

ts 复制代码
F extends P[number]

若比较结果为false,则表示F尚未出现重复,此时保留F,并推入P

ts 复制代码
[F,...Uniq<R,[...P,F]>]

则在下一次递归中,当条件成立时,说明出现重复,此时只需要将F剔除即可。另外,比较重要的是,此时需要做一次P的重置操作,因为当原成员出现次数超过两次时,我们需要保留一个用于下一次的对比

ts 复制代码
Uniq<R,Uniq<P>>

故,使用示例如下

下期预告

FindOnceAppearAtArray

  • 功能

找出数组中只出现过一次的成员

  • 使用示例
ts 复制代码
type case1 = FindOnceAppearAtArray<[1,2,2,3,3,4,5,6,6,6]> // [1,4,5]

如果本文对您有用,希望能得到您的点赞和收藏

订阅专栏,每周更新1-2篇类型体操,等你哟😎

相关推荐
struggle20254 小时前
AxonHub 开源程序是一个现代 AI 网关系统,提供统一的 OpenAI、Anthropic 和 AI SDK 兼容 API
css·人工智能·typescript·go·shell·powershell
执剑、天涯9 小时前
通过一个typescript的小游戏,使用单元测试实战(二)
javascript·typescript·单元测试
chéng ௹11 小时前
Vue3+Ts+Element Plus 权限菜单控制节点
前端·javascript·vue.js·typescript
武清伯MVP1 天前
阮一峰《TypeScript 教程》学习笔记——基本用法
笔记·学习·typescript
ttod_qzstudio2 天前
解决 Vue 3 + TypeScript 中 v-for 循环类型推断问题
前端·vue.js·typescript
今天头发还在吗3 天前
【React】动态SVG连接线实现:图片与按钮的可视化映射
前端·javascript·react.js·typescript·前端框架
冷冷的菜哥3 天前
react多文件分片上传——支持拖拽与进度展示
前端·react.js·typescript·多文件上传·分片上传
Kisang.3 天前
【HarmonyOS】窗口管理实战指南
前端·华为·typescript·harmonyos·鸿蒙
Dajiaonew4 天前
Vue3 + TypeScript 一篇文章 后端变全栈
前端·javascript·typescript
敲敲敲敲暴你脑袋4 天前
用3Dmol.js展示3D分子结构
typescript·webgl·数据可视化