type-challenges:First of Array

31 阅读1分钟

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
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'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>>]
​
type errors = [
  // @ts-expect-error
  First<'notArray'>,
  // @ts-expect-error
  First<{ 0: 'arrayLike' }>
]
​
// ============= Your Code Here =============
// 答案
// answer1
type First<T extends unknown[]> = T extends [infer R, ...unknown[]] ? R : never// answer2
// type First<T extends any[]> = '0' extends keyof T ? T[0] : never// answer3
// type First<T extends any[]> = T[number] extends never ? never : T[0]// answer4
// type First<T extends any[]> = T extends [] ? never : T[0]// answer5
// type First<T extends any[]> = T['length'] extends 0 ? never : T[0]// answer6
// type First<T extends any[]> = T extends [infer A, ...infer rest] ? A : never

返回数组中的第一个元素,只需要限制当前类型为数组类型,并且长度大于0时返回第一个元素,等于0时返回 never ,第一个元素等于 undefined 时返回 undefined 即可。 T extends any[] 代表泛型 T 为任意数组的子类型,这样就限制住了输入的泛型的类型,以上几种答案都可以。

第一种,infer 只能用在条件语句中的前置表达式中,即 条件? 前置表达式 : 后置表达式 ,当前的 R 类型会接收泛型 T 中的第一个类型。

第二种,'0' extends keyof Tkeyof 关键字用在数组泛型时,代表的就是数组的下标索引,这里的 keyof T 就是 0 1 2 ... 等。

第三种,泛型是数组时,可以直接使用 T[number] 来表示当前数组元素的值。

第五种, T['length'] 和可以直接取到当前数组泛型的长度。

其余不在介绍,基本类似。