题目
实现一个通用 First
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
单元测试
import { Equal, Expect } from '@type-challenges/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>>]
通过 JS 解题
functon first (arr) {// arr 是不是一个空数组,如果是返回 neverreturn arr[0] ? arr[0] : 'never';}functon first (arr) {if (arr.length === 0) return 'never';return arr[0];}// rest -> TS inferfunction first (arr) {const [first, ...rest] = arr;return first ? first : 'never';}
知识点
- extends 类型条件判断
- 获取 tuple 的 length 属性
- extends union 判断的规则
- infer 的使用(推断)
翻译为 TS
```typescript // 如果一个 [] 空数组的话,那么获取的 [0] 是 undefined, 不满足 Expect, never>> type First = T extends [] ? never : T[0];
type First
type First
type First
