工作累了吗,来点类型体操放松一下吧

321,上链接:type-challenges

它通过@type-challenges/utils包实现了类型检查,这样就可以直接在ts playground中运行。你可以点击Hello World感受一下。

简单难度的最后一个元素来举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
/* _____________ 你的代码 _____________ */

type Last<T extends any[]> = any

/* _____________ 测试用例 _____________ */
import type { Equal, Expect } from '@type-challenges/utils'

type cases = [
Expect<Equal<Last<[2]>, 2>>,
Expect<Equal<Last<[3, 2, 1]>, 1>>,
Expect<Equal<Last<[() => 123, { a: string }]>, { a: string }>>,
]

可以有很多解法,比如正统的

1
type Last<T extends unknown[]> = T extends [...infer _, infer L] ? L : never

或者调皮一点的

1
type Last<T extends unknown[]> = [any, ...T][T["length"]]

每道题都会有很多人在github issue上讨论,交流自己的想法。查看这些讨论相比一个简单的参考答案,对学习ts类型的帮助可谓是天差地别。

它受到市面上的类型工具库(比如type-festts-toolbeltutility-types等)启发,提供了简单、中等、困难、地狱4个难度的题目,涉及array、object、number、infer、template等方面。开心的去玩耍吧。