-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtypes.ts
43 lines (39 loc) · 1.06 KB
/
types.ts
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
40
41
42
43
import {
FilterCertainIntegers,
IsCertainlyInteger,
IsNever,
} from "./typeUtils.js";
export type ReadonlyArrayExactLength<T, N extends number> = N extends number
? number extends N
? readonly T[]
: IsCertainlyInteger<N> extends true
? ReadonlyArrayExactLengthRec<T, N, readonly []>
: readonly T[]
: never;
type ReadonlyArrayExactLengthRec<
T,
L extends number,
Result extends readonly T[],
> = Result["length"] extends L
? Result
: ReadonlyArrayExactLengthRec<T, L, readonly [T, ...Result]>;
export type ReadonlyArrayMinLength<T, N extends number> = number extends N
? readonly T[]
: FilterCertainIntegers<N> extends infer N extends number
? IsNever<N> extends true
? readonly T[]
: ReadonlyArrayMinLengthRec<T, N, [], readonly T[]>
: readonly T[];
type ReadonlyArrayMinLengthRec<
T,
L extends number,
Counter extends readonly unknown[],
Result extends readonly T[],
> = Counter["length"] extends L
? Result
: ReadonlyArrayMinLengthRec<
T,
L,
[unknown, ...Counter],
readonly [T, ...Result]
>;