diff --git a/packages/reffuse/src/types/SearchPaths.ts b/packages/reffuse/src/types/SearchPaths.ts index 18371b3..ec4f762 100644 --- a/packages/reffuse/src/types/SearchPaths.ts +++ b/packages/reffuse/src/types/SearchPaths.ts @@ -1,40 +1,34 @@ -type SearchPathsV1 = T extends object - ? { - [K in keyof T]: [K] | [K, ...SearchPathsV1] - }[keyof T] - : [] - -type SearchPathsV2 = T extends object +export type Paths = T extends object ? { [K in keyof T as K extends string | number | symbol ? K : never]: | [K] - | [K, ...SearchPathsV2] + | [K, ...Paths] } extends infer O ? O[keyof O] : never : [] -type Get = - P extends [infer Head, ...infer Tail] +type ValueFromPath = P extends [infer Head, ...infer Tail] ? Head extends keyof T - ? Get - : T extends readonly any[] - ? Head extends number - ? Get - : never - : never - : T; + ? ValueFromPath + : T extends readonly any[] + ? Head extends number + ? ValueFromPath + : never + : never + : T -type Persons = { - name: string; -}[] - -type V = SearchPathsV2<[string, number]> +const persons = [ + { name: "Monsieur Poulet" }, + { name: "El Chanclador" }, + { name: "AAAYAYAYAYAAY" }, +] -function getFromSearchPath>(obj: T, path: P): Get { - return path.reduce((acc: any, key: any) => acc?.[key], obj); -} +const getFromPath = >(value: T, path: P): ValueFromPath => ( + path.reduce((acc: any, key: any) => acc?.[key], value) +) -const res = getFromSearchPath([{ name: "prout" }] as const, ["0", "name"]) +const res = getFromPath(persons, [1, "name"]) +console.log(res)