TypeScript类型体操--获取数组的中间元素

大家好,我是苏先生,2024年我的第一愿景就是做一个可行的副业,求大佬带我~~

好文推荐

前言

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

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

提示

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

实现

这个工具类型实现起来还是比较简单的,只需要在数组的首尾放两个指针,并每次向中间各移动一位即可

假设数组是[number,number,number,number,number,number,number],则指针初始位置在0和6的位置

由于指针所表示的元素是即将被抛弃的元素,所以我们可以使用any来表示,也就是下边这样

ts 复制代码
[any,...,any]

至于中间的部分,则使用infer进行提取就行

ts 复制代码
[any,... infer M,...any]

infer推倒出来的剩余部分,重复前边两步就行了,也就是递归

既是递归,就涉及到出口

显然,当数组的成员数为0或1或2时,得到的中间元素始终是数组本身

设工具类型为GetMiddleElement,入参为T且约束为数组类型

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

当其长度

ts 复制代码
T['length']

为0/1/2时,递归结束

ts 复制代码
type GetMiddleElement<T extends any[]> = T['length'] extends 0|1|2 ? T : ...

否则,指针移动,使用infer提取出剩余部分M

ts 复制代码
T extends [any,...infer M,any]

对M继续递归

ts 复制代码
GetMiddleElement<M>

故,完整的代码如下

ts 复制代码
type GetMiddleElement<T extends any[]> = 
  T['length'] extends 0 | 1 | 2?
    T:
    T extends [any,...infer M,any]?
      GetMiddleElement<M>:never

使用示例如下

拓展

思考一下,如果想要得到的是对应的中间元素的下标,应该怎么处理呢?

思考一下,感兴趣的,可以评论区贴出答案哦🥰

下期预告

AppendArgument

  • 功能

为函数追加参数

  • 使用示例
ts 复制代码
type Fn = (a: number, b: string) => number

type case = AppendArgument<Fn, boolean>  
// (a: number, b: string, x: boolean) => number

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

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

相关推荐
紫微AI1 小时前
前端文本测量成了卡死一切创新的最后瓶颈,pretext实现突破了
前端·人工智能·typescript
若梦plus2 小时前
TypeScript进阶
前端·javascript·typescript·ecmascript
Restart-AHTCM11 小时前
AI 时代的大前端崛起,TypeScript 重塑前端开发
前端·人工智能·typescript·ai编程·a
一袋米扛几楼9811 小时前
【报错问题】解决 Vercel 部署报错:Express 类型失效与 TypeScript 2349/2339/2769 错误排查
ubuntu·typescript·express
一袋米扛几楼9813 小时前
【报错问题】彻底解决 TypeScript 报错 TS2769: No overload matches this call (JWT 篇)
linux·javascript·typescript
涵涵(互关)13 小时前
语法大全-only-writer-two
前端·vue.js·typescript
漫游的渔夫14 小时前
前端开发者做 Agent:Tool Calling 别只写函数名,用 Schema 少踩 5 个坑
前端·人工智能·typescript
zhensherlock16 小时前
Protocol Launcher 系列:Beorg 高效任务管理的协议支持
前端·javascript·typescript·node.js·自动化·github·js
深海鱼在掘金1 天前
深入浅出 LangChain —— 第二章:环境搭建与快速上手
人工智能·typescript·langchain
俺不会敲代码啊啊啊2 天前
el-table实现行拖拽(包含展开项)
前端·vue.js·typescript