-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.ts
More file actions
31 lines (27 loc) · 919 Bytes
/
index.ts
File metadata and controls
31 lines (27 loc) · 919 Bytes
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
type RRequired<T> = NonNullable<Required<T>>;
type KKeyOf<T> = keyof RRequired<T> & (string | number);
interface PathResult<T, TPath extends string | number> {
(): TPath;
<TKey extends KKeyOf<T>>(key: TKey): PathResult<
RRequired<T>[TKey],
`${TPath}.${TKey}`
>;
}
function safePath<T, TKey extends KKeyOf<T> = KKeyOf<T>>(key: TKey) {
function subpath<T, TPath extends string | number>(
path: TPath
): PathResult<T, TPath> {
const x = (<TKey extends KKeyOf<T>>(subkey: TKey | undefined) =>
subkey === undefined
? path
: subpath<RRequired<T>[TKey], `${TPath}.${TKey}`>(
`${path}.${subkey}`
)) as PathResult<any, any>;
return x;
}
return subpath<RRequired<T>[TKey], TKey>(key);
}
export function formikPathBuilder<T>(example?: T) {
return <TKey extends KKeyOf<T>>(key: TKey) => safePath<T, TKey>(key);
}
export default formikPathBuilder;