类型体操刷题系列(二十二)— Zip/IsTuple/Chunk

328 阅读1分钟

目的

Github上的类型体操,让你写出更加优雅的TS类型定义,以及探寻TS中我们不熟悉的只是,让我们开始TS的类型挑战把~2022希望通过更文的方式来督促自己学习,每日三题,坚持日更不断~~

题目大纲

  1. Medium Zip
  2. Medium Is Tuple
  3. Medium Chunk

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];

知识点

  • 简单的递归,只需要对零界点做相关判断即可