From 33cf4fbcbd5eb8f860cb8cc914bb0fc0e1571659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 21 Apr 2025 05:15:55 +0200 Subject: [PATCH] Tests --- packages/reffuse/src/types/SearchPaths.ts | 40 +++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 packages/reffuse/src/types/SearchPaths.ts diff --git a/packages/reffuse/src/types/SearchPaths.ts b/packages/reffuse/src/types/SearchPaths.ts new file mode 100644 index 0000000..18371b3 --- /dev/null +++ b/packages/reffuse/src/types/SearchPaths.ts @@ -0,0 +1,40 @@ +type SearchPathsV1 = T extends object + ? { + [K in keyof T]: [K] | [K, ...SearchPathsV1] + }[keyof T] + : [] + +type SearchPathsV2 = T extends object + ? { + [K in keyof T as K extends string | number | symbol ? K : never]: + | [K] + | [K, ...SearchPathsV2] + } extends infer O + ? O[keyof O] + : never + : [] + +type Get = + P extends [infer Head, ...infer Tail] + ? Head extends keyof T + ? Get + : T extends readonly any[] + ? Head extends number + ? Get + : never + : never + : T; + + +type Persons = { + name: string; +}[] + +type V = SearchPathsV2<[string, number]> + + +function getFromSearchPath>(obj: T, path: P): Get { + return path.reduce((acc: any, key: any) => acc?.[key], obj); +} + +const res = getFromSearchPath([{ name: "prout" }] as const, ["0", "name"])