[TypeScript] Type Challenges #14 - First of Array

84 阅读1分钟

题目描述

实现一个First<T>泛型,它接受一个数组T并返回它的第一个元素的类型。

例如:

type arr1 = ['a''b''c']
type arr2 = [321]

type head1 = First<arr1> // 应推导出 'a'
type head2 = First<arr2> // 应推导出 3

题解

// ============= Test Cases =============
import type { EqualExpect } from './test-utils'

type cases = [
  Expect<Equal<First<[321]>, 3>>,
  Expect<Equal<First<[() => 123, { astring }]>, () => 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 =============
type First<T extends any[]> = T extends [infer A, ...infer _] ? A : never

1、infer关键字主要用于在条件类型里进行类型推断

2、infer A的作用是从类型T里提取出第一个元素的类型

例如,当T['a', 'b', 'c']时,[infer A, ...infer _]会把T中的第一个元素'a'的类型提取出来,并赋值给A

T[]时,不符合T extends [infer A, ...infer _]这个条件。因为[infer A, ...infer _]表示的是至少含有一个元素的数组结构,而空数组没有元素

3、infer _同样是在进行类型推断,但这里的下划线_表示我们对这部分推断出的类型并不关心。它的主要作用是匹配数组中除了第一个元素之外的其他元素组成的剩余部分的类型结构,起到一种占位符的作用