-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.ts
40 lines (36 loc) · 1.24 KB
/
index.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
type Primitive = string | number;
type PremitiveWithBoolean = Primitive | boolean;
type PrefixHelper<
TKey extends string,
TPrefix extends string
> = TPrefix extends '' ? TKey : `${TPrefix}.${TKey}`;
type PrefixHelperExtended<
TKey extends string,
TPrefix extends string
> = TPrefix extends '' ? TKey : `${TPrefix}.${TKey}` | TPrefix;
type NestedKeysMain<
T extends Record<Primitive, any>,
TPrefix extends string = ''
> = keyof T extends infer TKey
? TKey extends string
? NonNullable<T[TKey]> extends infer TVal
? TVal extends Array<PremitiveWithBoolean>
? TPrefix extends ''
? `${TKey}.${number}` | TKey
: `${TPrefix}.${TKey}.${number}` | `${TPrefix}.${TKey}` | TPrefix
: TVal extends Array<object>
?
| NestedKeysMain<
TVal[number],
`${PrefixHelper<TKey, TPrefix>}.${number}`
>
| PrefixHelperExtended<TKey, TPrefix>
: TVal extends object
? NestedKeysMain<TVal, PrefixHelper<TKey, TPrefix>>
: TVal extends PremitiveWithBoolean
? PrefixHelperExtended<TKey, TPrefix>
: never
: never
: never
: never;
export type NestedKeys<T extends Record<Primitive, any>> = NestedKeysMain<T>;