第一个元素First<T>
题目
实现一个通用First<T>
,它接受一个数组T
并返回它的第一个元素的类型。
例如:
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
题目来源:https://tsch.js.org/14/zh-CN
解答
解法一
type First<T extends any[]> = T['length'] extends 0 ? never : T[0];
type First<T extends any[]> = T extends [] ? never : T[0]
判断数组长度,如果长度不是0,则代表0位有值,可以取0位。
解法二
type First<T extends any[]> = T[0] extends T[number] ? T[0] : never;
通过T[number]
代表数组单个项的值,推断T[0] extends T[number]
。
如果属于,则代表长度大于0,有值。
解法三
type First<T extends any[]> = T extends [infer F] ? F : never
通过infer
指代数组第一个项,如果T extends [infer F]
推断是true
,则得到第一个项type为F
。
解法四
type First<T> = T extends [infer P, ...infer Rest] ? P : never
使用扩展运算符,配合infer
,可以得到第一个项的type。