Skip to content

第一个元素

约 302 字大约 1 分钟

2022-12-01

题目

Github: 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

解题思路

获取数组的第一个元素类型,首先想到通过 索引类型,通过 T[0] 获取类型, 但是这里会有一个临界情况,如果传入的是一个空数组,会导致 T[0] 不能正常工作,因为它没有元素。

所以在获取数组的第一个元素类型前,需要检查数组是否为空。 可以通过 条件类型 推断数组是否为空,如果为空,则什么都不返回。

答案

type First<T extends any[]> = T extends [] ? never : T[0]

验证

// @errors: 2540
import type { Equal, Expect } from '~/tc-utils'
type First<T extends any[]> = T extends [] ? never : T[0]
// ---cut---
type cases = [
  Expect<Equal<First<[]>, never>>,
  Expect<Equal<First<['a', 'b', 'c']>, 'a'>>,
  Expect<Equal<First<[3, 2, 1]>, 3>>
]

参考