-
Notifications
You must be signed in to change notification settings - Fork 274
/
deepPick.ts
43 lines (40 loc) · 958 Bytes
/
deepPick.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
/**
* This file should probably be contributed to type-fest
*/
import type { Simplify, UnionToIntersection } from "type-fest"
type DeepPath<
T,
Depth extends number = 5,
CurrentDepth extends number[] = [],
> = CurrentDepth["length"] extends Depth
? never
: T extends Record<string, any>
? {
[K in keyof T]: T[K] extends Record<string, any>
?
| K
| `${Extract<K, string>}.${DeepPath<
T[K],
Depth,
[...CurrentDepth, 0]
>}`
: K
}[keyof T]
: never
export type DeepPick<
T,
K extends DeepPath<T>,
Depth extends number = 5,
> = Simplify<
UnionToIntersection<
{
[P in K]: P extends `${infer A}.${infer R}`
? A extends keyof T
? { [K in A]: DeepPick<T[A], Extract<R, DeepPath<T[A], Depth>>> }
: never
: P extends keyof T
? { [K in P]: T[P] }
: never
}[K]
>
>