Typescript Flatten Object Type
Jun 29, 2023
type ToPaths<T, P extends string = ''> = T extends Record<number, unknown>
? {
[K in keyof T]: ToPaths<T[K], `${P}${K & string}.`>
}[keyof T]
: { path: P extends `${infer P}.` ? P : never; type: T }
type FromPaths<T extends { path: string; type: unknown }> = {
[P in T['path']]: Extract<T, { path: P }>['type']
}
type A = FromPaths<ToPaths<{
// ^?
a: 1,
b: {
c: 2,
d: Record<string, {
e: 3,
f: 4,
}>,
g: 5,
},
h: {
i: {
j: 6,
},
},
}>>