Type-Chanllengs 返回数组的第一个元素 的 多种解法

35 阅读1分钟

简介

最近在学习 Type-Chanllengs, 发现一些有意思的知识。在这里记录分享一下。

原题

Type-Chanllengs 有一道题目如下:实现一个通用 First<T>,它接受一个数组 T 并返回它的第一个元素的类型。

// exg:
type arr1 = ['a', 'b', 'c']
type arr2 = [3, 2, 1]

type head1 = First<arr1> // expected to be 'a'
type head2 = First<arr2> // expected to be 3

// test-case
type cases = [
  Expect<Equal<First<[3, 2, 1]>, 3>>,
  Expect<Equal<First<[() => 123, { a: string }]>, () => 123>>,
  Expect<Equal<First<[]>, never>>,
  Expect<Equal<First<[undefined]>, undefined>>,
]

解答

这道题目难度并不高,但是我们要适当发挥自已的思维,多给出几种解法,在这里我有 4个解法及思路。

解法 1

我们可以直接返回数组第一项,但是要注意,当传入空数组时需要过滤处理。

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

解法 2

我们根据数组的长度,判断是否有元素。(本质上和第一种解法差别不在)

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

解法 3

可以判断某一项是否在数组里。

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

解法 4

使用 infer 去 (推断类型) 获取未知变量。

type First<T extends any[]> = T[0] extends [infer F,...unknow[]] ? F : never

结语

以上就是我的 4 种解法,这个题目虽然不是很难,但是发散出思维却也不太容易。大家有其它解法也欢迎在评论区分享出来!

好了,今天的内容就到分享这里啦,很享受与大家一起学习,沟通交流问题,如果喜欢的话,请为我点个赞吧 !👍

作者:chenuvi

邮箱: chenui@outlook.com