题目
实现一个通用 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 是不是一个空数组,如果是返回 never
return arr[0] ? arr[0] : 'never';
}
functon first (arr) {
if (arr.length === 0) return 'never';
return arr[0];
}
// rest -> TS infer
function 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