14 第一个元素
约 332 字大约 1 分钟
题目
实现一个First<T>泛型,它接受一个数组T并返回它的第一个元素的类型。
例如:
type arr1 = ['a', 'b', 'c']
type arr2 = [3, 2, 1]
type head1 = First<arr1> // 应推导出 'a'
type head2 = First<arr2> // 应推导出 3解法
我们在13 元组转换为对象 中提及可以使用T[number]提取出元组中的所有元素组成字面量联合类型。类似的,我们可以使用T[0]获取到第一个元素作为字面量类型。
因此要提取出第一个元素,只要:
type First<T extends any[]> = T[0]但是报错,这是因为有一个测试用例为空数组,要求返回never。
结合条件判断是否为空数组即可:
type First<T extends any[]> = T extends [] ? never : T[0]还有别的解法。在 JavaScript 中,数组也为一个对象。我们可以获取它的长度,并判断其是否为 0:
type First<T extends any[]> = T['length'] extends 0 ? never : T[0]或者我们可以判断T[0]是否为T[number]的子类型:
type First<T extends any[]> = T[0] extends T[number] ? T[0] : neverJavaScript 中的展开运算符和解构赋值也可以使用:
type First<T extends any[]> = T extends [infer First, ...infer Others] ? First : never