-
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathrangeof.ts
More file actions
39 lines (35 loc) · 1.03 KB
/
rangeof.ts
File metadata and controls
39 lines (35 loc) · 1.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//https://github.com/microsoft/TypeScript/issues/26223#issuecomment-674514787 :pray:
export type RangeOf<N extends number> = Partial<TupleOf<unknown, N>>['length'];
type BuildPowersOf2LengthArrays<
N extends number,
R extends never[][]
> = R[0][N] extends never
? R
: BuildPowersOf2LengthArrays<N, [[...R[0], ...R[0]], ...R]>;
type ConcatLargestUntilDone<
N extends number,
R extends never[][],
B extends never[]
> = B['length'] extends N
? B
: [...R[0], ...B][N] extends never
? ConcatLargestUntilDone<
N,
R extends [R[0], ...infer U] ? (U extends never[][] ? U : never) : never,
B
>
: ConcatLargestUntilDone<
N,
R extends [R[0], ...infer U] ? (U extends never[][] ? U : never) : never,
[...R[0], ...B]
>;
type Replace<R extends any[], T> = { [K in keyof R]: T };
type TupleOf<T, N extends number> = number extends N
? T[]
: {
[K in N]: BuildPowersOf2LengthArrays<K, [[never]]> extends infer U
? U extends never[][]
? Replace<ConcatLargestUntilDone<K, U, []>, T>
: never
: never;
}[N];