Skip to content

Instantly share code, notes, and snippets.

@ephrin
Created July 18, 2022 10:00
Show Gist options
  • Save ephrin/81e15ca000c9984186061cc50b52aa11 to your computer and use it in GitHub Desktop.
Save ephrin/81e15ca000c9984186061cc50b52aa11 to your computer and use it in GitHub Desktop.
Typescript nested object paths
type AnyObject = Record<string, unknown>;
export type Join<K, P> = K extends string | number
? P extends string | number
? `${K}${'' extends P ? '' : '.'}${P}`
: never
: never;
export type Prev = [
never,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
...0[]
];
// noinspection JSUnusedGlobalSymbols
export type Paths<T, D extends number = 10> = [D] extends [never]
? never
: T extends AnyObject
? {
[K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K], Prev[D]>> : never;
}[keyof T]
: '';
export type Leaves<T, D extends number = 10> = [D] extends [never]
? never
: T extends AnyObject
? { [K in keyof T]-?: Join<K, Leaves<T[K], Prev[D]>> }[keyof T]
: '';
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment