/** * Extracts all deep paths of nested types. * * @example * type Keys = Path<{ a: { b: { c: "C" } } }>; * // Keys = "a" | "a.b" | "a.b.c" */ export type Path = keyof T extends string ? PathImpl2 extends infer P ? P extends string | keyof T ? P : keyof T : keyof T : never; /** * Extracts the value of a deep path. * * @example * type Val = PathValue<{ a: { b: { c: "C" } } }, "a.b.c">; * // Val = "C"; */ export type PathValue> = P extends `${infer Key}.${infer Rest}` ? Key extends keyof T ? Rest extends Path ? PathValue : never : never : P extends keyof T ? T[P] : never; /** * Returns a deeply-flattened type * @example * PathEntries<{ a: { b: "C" } }> === { a: { b: "C" }, "a.b": "C" } */ export type PathEntries = { [P in Path]: PathValue; }; type IsAny = unknown extends T ? [keyof T] extends [never] ? false : true : false; type PathImpl = Key extends string ? IsAny extends true ? never : T[Key] extends Record ? `${Key}.${PathImpl> & string}` | `${Key}.${Exclude & string}` : never : never; type PathImpl2 = PathImpl | keyof T; export {};