type-challenges:Construct Tuple

24 阅读1分钟

Construct Tuple

问题描述

构造一个给定长度的元组。

例如

type result = ConstructTuple<2> // 期望得到 [unknown, unkonwn]
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'type cases = [
  Expect<Equal<ConstructTuple<0>, []>>,
  Expect<Equal<ConstructTuple<2>, [unknown, unknown]>>,
  Expect<Equal<ConstructTuple<999>['length'], 999>>,
  // @ts-expect-error
  Expect<Equal<ConstructTuple<1000>['length'], 1000>>,
]
​
// ============= Your Code Here =============
type ConstructTuple<L extends number, A extends readonly unknown[] = []> =
  L extends A['length']
    ? A
    : ConstructTuple<L, [...A, unknown]>

做了很多道关于长度的题目,一般想要得到长度,都是多加一个泛型参数,用元组的长度来表示,元组的特性是,取 length 会得到具体的数值,所以使用 L extends A['length'] 来判断是否相同,不相同则向数组中添加一项即可。这里为什么 1000 次时会报错,是因为typescript 中有限制,TS2589 表示“类型实例化递归嵌套过深且可能无限”的错误。如果想要获得超过一千项的元组长度,可以参考下大佬的解题思路

// 本题答案
type ConstructTuple<L extends number, O extends string = `${L}`, Count extends unknown[] = []> =
  O extends `${infer F}${infer R}` ? (
    ConstructTuple<L, R, N<Count>[keyof N & F]>
  ) : Counttype N<T extends unknown[] = []> = {
  '0': [...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T],
  '1': [...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, unknown],
  '2': [...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, unknown, unknown],
  '3': [...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, unknown, unknown, unknown],
  '4': [...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, unknown, unknown, unknown, unknown],
  '5': [...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, unknown, unknown, unknown, unknown, unknown],
  '6': [...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, unknown, unknown, unknown, unknown, unknown, unknown],
  '7': [...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, unknown, unknown, unknown, unknown, unknown, unknown, unknown],
  '8': [...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown],
  '9': [...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, ...T, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown],
}