简介
最近在学习 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