type-challenges:Chunk

31 阅读1分钟

Chunk

问题描述

你知道吗lodashChunk是其中非常有用的函数,现在让我们来实现它。 Chunk<T, N>接受两个必需的类型参数, 必须Ttuple, 必须Ninteger >=1

type exp1 = Chunk<[1, 2, 3], 2> // expected to be [[1, 2], [3]]
type exp2 = Chunk<[1, 2, 3], 4> // expected to be [[1, 2, 3]]
type exp3 = Chunk<[1, 2, 3], 1> // expected to be [[1], [2], [3]]
// ============= Test Cases =============
import type { Equal, Expect } from './test-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]]>>,
]
​
​
// ============= Your Code Here =============
type Chunk<
  T extends any[],
  U extends number = 1,
  S extends any[] = [],
  V extends any[] = [],
> = T extends [infer F, ...infer R]
  ? S['length'] extends U
    ? Chunk<R, U, [F], [...V, S]>
    : Chunk<R, U, [...S, F], V>
  : S['length'] extends 0
  ? V
  : [...V, S]
type Chunk<T extends any[], U extends number = 1, S extends any[] = []> = T extends [infer F,...infer R]
  ? S['length'] extends U
    ? [S, ...Chunk<T, U>]
    : Chunk<R, U, [...S, F]>
  : S['length'] extends 0
  ? S
  : [S]
​

我宣布,我是个菜鸡。

看看大佬的带思路版的答案