TypeScript类型体操--FindOnceAppearAtArray

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

github与好文

前言

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

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

提示

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

实现

首先,老规矩,使用type自定义一个名为FindOnceAppearAtArray的新类型,并且它接受两个泛型参数

ts 复制代码
type FindOnceAppearAtArray<T extends any[],U = never>

接着,对泛型参数T构造条件类型,这不仅能对用户传递T做校验,也能够通过infer提取出当前要参与逻辑运算的F。如下,F表示数组的第一个成员,R则表示剩余成员

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

我们的目的是将重复的成员剔除,所以需要一个变量来标记出现重复的key,也就是一开始创建的泛型参数U

那么,拿当前推断出来的FU里找

如果没找到,则说明F尚不存在重复,但这不能代表整个FT中不重复,因此,还需要从剩余的R中找是否存在重复

ts 复制代码
F extends R[number] ? '递归剔除':'记录结果并递归'

一旦找到重复,就将F记录进U,并递归去剔除F

ts 复制代码
FindOnceAppearAtArray<R, U | F>

此时如果还是找不到,则说明F在整个T中唯一,此时需要将其作为结果记录下来。并对R递归,这样就能依次找T中的第二、第三、...第n个是否重复并在唯一时进行记录了

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

现在的关键点在于,如何做到递归剔除,也即FU里找,找到的情况如何处理。如下,只需要将F丢弃并对剩余的R进行递归就好了

ts 复制代码
FindOnceAppearAtArray<R, U> 

最后,需要保证返回的类型以及为递归找出口。如下,当倒数第2次,即T中只有一个成员时,R为空,下一次将进入falsy的结果,此时取[]返回,就保证了递归结束,并且在记录最终结果的递归中使用扩展运算符不出错

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

故,使用示例如下

下期预告

Square

  • 功能

获取平方数

  • 使用示例
ts 复制代码
type case = Square<4> // 16

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

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

相关推荐
zhensherlock2 小时前
Protocol Launcher 系列:Beorg 高效任务管理的协议支持
前端·javascript·typescript·node.js·自动化·github·js
深海鱼在掘金12 小时前
深入浅出 LangChain —— 第二章:环境搭建与快速上手
人工智能·typescript·langchain
俺不会敲代码啊啊啊1 天前
el-table实现行拖拽(包含展开项)
前端·vue.js·typescript
懒人村杂货铺1 天前
Express + TypeScript 后端通用标准规范
javascript·typescript·express
涵涵(互关)1 天前
语法大全-only-writer
开发语言·前端·vue.js·typescript
涵涵(互关)1 天前
GoView各项目文件中的相关语法
前端·vue.js·typescript
深海鱼在掘金1 天前
深入浅出 LangChain — 第一章:AI Agent 开发导论
typescript·langchain·agent
深海鱼在掘金1 天前
深入浅出 LangChain — 导读
typescript·langchain·agent
军军君012 天前
数字孪生监控大屏实战模板:固体颗粒物监管平台
前端·javascript·vue.js·typescript·前端框架·echarts·less
一袋米扛几楼982 天前
【前端开发】基于TypeScript打破 React 黑盒——组件的“工厂心智模型”与源码解剖
javascript·react.js·typescript