目的
Github上的类型体操,让你写出更加优雅的TS类型定义,以及探寻TS中我们不熟悉的只是,让我们开始TS的类型挑战把~2022希望通过更文的方式来督促自己学习,每日三题,坚持日更不断~~
题目大纲
01. Medium Zip
题目要求
import { Equal, Expect } from '@type-challenges/utils'
type cases = [
Expect<Equal<Zip<[], []>, []>>,
Expect<Equal<Zip<[1, 2], [true, false]>, [[1, true], [2, false]]>>,
Expect<Equal<Zip<[1, 2, 3], ['1', '2']>, [[1, '1'], [2, '2']]>>,
Expect<Equal<Zip<[], [1, 2, 3]>, []>>,
Expect<Equal<Zip<[[1, 2]], [3]>, [[[1, 2], 3]]>>,
]
我的答案
type Zip<
T extends any[],
U extends any[],
R extends any[] = []
> = T["length"] extends 0
? R
: T extends [infer A, ...infer B]
? U extends [infer C, ...infer D]
? Zip<B, D, [...R, [A, C]]>
: R
: R;
2. Medium IsTuple
题目要求
import { Equal, Expect, ExpectFalse, NotEqual } from '@type-challenges/utils'
type cases = [
Expect<Equal<IsTuple<[]>, true>>,
Expect<Equal<IsTuple<[number]>, true>>,
Expect<Equal<IsTuple<readonly [1]>, true>>,
Expect<Equal<IsTuple<{ length: 1}>, false>>,
Expect<Equal<IsTuple<number[]>, false>>,
]
我的解答
type IsTuple<T> = T extends []
? true
: T extends readonly [infer P, ...infer R]
? true
: false;
知识点
- 对于tuple的判断根据以下两点:
- 使用readonly
- 使用
infer能推断出具体类型,如果是array是推断不出来具体某一项的类型的
3. Medium Chunk
题目要求
import { Equal, Expect } from '@type-challenges/utils'
type cases = [
Expect<Equal<Chunk<[], 1>, []>>,
Expect<Equal<Chunk<[1, 2, 3], 1>, [[1], [2], [3]]>>,
Expect<Equal<Chunk<[1, 2, 3], 2>, [[1, 2], [3]]>>,
Expect<Equal<Chunk<[1, 2, 3, 4], 2>, [[1, 2], [3, 4]]>>,
Expect<Equal<Chunk<[1, 2, 3, 4], 5>, [[1, 2, 3, 4]]>>,
Expect<Equal<Chunk<[1, true, 2, false], 2>, [[1, true], [2, false]]>>,
]
我的解答
type Chunk<
T extends readonly any[],
N extends number,
R extends any[] = [],
C extends any[] = []
> = T extends [infer A, ...infer B]
? C["length"] extends N
? Chunk<B, N, [...R, C], [A]>
: Chunk<B, N, R, [...C, A]>
: C extends []
? R
: [...R, C];
知识点
- 简单的递归,只需要对零界点做相关判断即可