@reffuse/extension-query 0.1.4 #15
@@ -1,40 +1,34 @@
|
|||||||
type SearchPathsV1<T> = T extends object
|
export type Paths<T> = T extends object
|
||||||
? {
|
|
||||||
[K in keyof T]: [K] | [K, ...SearchPathsV1<T[K]>]
|
|
||||||
}[keyof T]
|
|
||||||
: []
|
|
||||||
|
|
||||||
type SearchPathsV2<T> = T extends object
|
|
||||||
? {
|
? {
|
||||||
[K in keyof T as K extends string | number | symbol ? K : never]:
|
[K in keyof T as K extends string | number | symbol ? K : never]:
|
||||||
| [K]
|
| [K]
|
||||||
| [K, ...SearchPathsV2<T[K]>]
|
| [K, ...Paths<T[K]>]
|
||||||
} extends infer O
|
} extends infer O
|
||||||
? O[keyof O]
|
? O[keyof O]
|
||||||
: never
|
: never
|
||||||
: []
|
: []
|
||||||
|
|
||||||
type Get<T, P extends any[]> =
|
type ValueFromPath<T, P extends any[]> = P extends [infer Head, ...infer Tail]
|
||||||
P extends [infer Head, ...infer Tail]
|
|
||||||
? Head extends keyof T
|
? Head extends keyof T
|
||||||
? Get<T[Head], Tail>
|
? ValueFromPath<T[Head], Tail>
|
||||||
: T extends readonly any[]
|
: T extends readonly any[]
|
||||||
? Head extends number
|
? Head extends number
|
||||||
? Get<T[number], Tail>
|
? ValueFromPath<T[number], Tail>
|
||||||
: never
|
: never
|
||||||
: never
|
: never
|
||||||
: T;
|
: T
|
||||||
|
|
||||||
|
|
||||||
type Persons = {
|
const persons = [
|
||||||
name: string;
|
{ name: "Monsieur Poulet" },
|
||||||
}[]
|
{ name: "El Chanclador" },
|
||||||
|
{ name: "AAAYAYAYAYAAY" },
|
||||||
type V = SearchPathsV2<[string, number]>
|
]
|
||||||
|
|
||||||
|
|
||||||
function getFromSearchPath<T, const P extends SearchPathsV2<T>>(obj: T, path: P): Get<T, P> {
|
const getFromPath = <T, const P extends Paths<T>>(value: T, path: P): ValueFromPath<T, P> => (
|
||||||
return path.reduce((acc: any, key: any) => acc?.[key], obj);
|
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user