DEV Community

Acid Coder
Acid Coder

Posted on

Typescript Flatten Object Type

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,
        },
    },
}>>


Enter fullscreen mode Exit fullscreen mode

Image description
playground

Top comments (0)