14 第一个元素
约 332 字大约 1 分钟
2025-07-07
题目
实现一个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] : never
JavaScript 中的展开运算符和解构赋值也可以使用:
type First<T extends any[]> = T extends [infer First, ...infer Others] ? First : never