simplify the life

【type-challenges】第一个元素

第一个元素

链接

获取元素的第一个元素,当作类型,T[0] 即可拿到,关键是需要判空

参考 14 - First of Array --->三种答案

方法一

直接特判空元祖

type First<T extends any[]> = T extends [] ? never : T[0]

方法二

拿 length 判断

type First<T extends any[]> = T['length'] extends 0 ? never : T[0]

方法一和方法二其实类似,相当于都是特判空数组,一个直接和 [] 特判,一个是利用 T['length'] 来特判

感觉 ts 中的三目运算符,只能用 extends 关键字实现,另外 ts 没有 === 的概念,所以需要用到相等的场景,其实也可以用 extends 关键字

方法三

使用 infer

type First<T extends any[]> = T extends [infer A, ...infer rest] ? A : never

以下介绍 infer

T extends U ? X: Y

如果 U 是一个可以被分解成几个部分的类型(比如元祖),这时候可以通过 infer 来获取 U 中某个部分的类型(推导泛型参数)

infer 语法的限制如下:

  1. infer 只能在条件类型的 extends 子句中使用
  2. infer 得到的类型只能在 true 语句中使用

posted on 2023-04-22 20:08  lessfish  阅读(100)  评论(0)    收藏  举报

导航