第一个元素
题目
Github: First of array
实现一个 First<T>
泛型,它接受一个数组T并返回它的第一个元素的类型。
type arr1 = ['a', 'b', 'c']
type arr2 = [3, 2, 1]
type head1 = First<arr1> // 应推导出 'a'
type head2 = First<arr2> // 应推导出 3
解题思路
获取数组的第一个元素类型,首先想到通过 索引类型,通过 T[0]
获取类型, 但是这里会有一个临界情况,如果传入的是一个空数组,会导致 T[0]
不能正常工作,因为它没有元素。
所以在获取数组的第一个元素类型前,需要检查数组是否为空。 可以通过 条件类型 推断数组是否为空,如果为空,则什么都不返回。
答案
type First<T extends any[]> = T extends [] ? never : T[0]
验证
type cases = [
Expect<Equal<First<[]>, never>>,
Expect<Equal<First<['a', 'b', 'c']>, 'a'>>,
Expect<Equal<First<[3, 2, 1]>, 3>>
]