题目

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

  1. type arr1 = ['a', 'b', 'c']
  2. type arr2 = [3, 2, 1]
  3. type head1 = First<arr1> // expected to be 'a'
  4. type head2 = First<arr2> // expected to be 3

单元测试

  1. import { Equal, Expect } from '@type-challenges/utils'
  2. type cases = [
  3. Expect<Equal<First<[3, 2, 1]>, 3>>,
  4. Expect<Equal<First<[() => 123, { a: string }]>, () => 123>>,
  5. Expect<Equal<First<[]>, never>>,
  6. Expect<Equal<First<[undefined]>, undefined>>
  7. ]

通过 JS 解题

  1. functon first (arr) {
  2. // arr 是不是一个空数组,如果是返回 never
  3. return arr[0] ? arr[0] : 'never';
  4. }
  5. functon first (arr) {
  6. if (arr.length === 0) return 'never';
  7. return arr[0];
  8. }
  9. // rest -> TS infer
  10. function first (arr) {
  11. const [first, ...rest] = arr;
  12. return first ? first : 'never';
  13. }

知识点

  1. extends 类型条件判断
  2. 获取 tuple 的 length 属性
  3. extends union 判断的规则
  4. infer 的使用(推断)

    翻译为 TS

    ```typescript // 如果一个 [] 空数组的话,那么获取的 [0] 是 undefined, 不满足 Expect, never>> type First = T extends [] ? never : T[0];

type First = T[“length”] extends 0 ? never: T[0];

type First = T[0] extends T[number] ? T[0] : never;

type First = T extends [infer First, …infer Rest] ? First : never; ```