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]>
) : Count
type 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],
}