Skip to content

Instantly share code, notes, and snippets.

@guiseek
Created January 12, 2024 01:13
Show Gist options
  • Save guiseek/8dd1a845db8e127192c2f9e14a3e5410 to your computer and use it in GitHub Desktop.
Save guiseek/8dd1a845db8e127192c2f9e14a3e5410 to your computer and use it in GitHub Desktop.
Deep Value
type Path<T extends unknown[]> = T extends [
infer A,
infer B,
infer C,
infer D,
infer E,
infer F,
infer G,
infer H,
infer I
]
? `${A & string}.${B & string}.${C & string}.${D & string}.${E & string}.${F &
string}.${G & string}.${H & string}.${I & string}`
: T;
export function deepValue<T extends object, P1 extends keyof T>(
value: T,
...path: Path<[P1]>
): T[P1];
export function deepValue<
T extends object,
P1 extends keyof T,
P2 extends keyof T[P1]
>(value: T, ...path: Path<[P1, P2]>): T[P1][P2];
export function deepValue<
T extends object,
P1 extends keyof T,
P2 extends keyof T[P1],
P3 extends keyof T[P1][P2]
>(value: T, ...path: Path<[P1, P2, P3]>): T[P1][P2][P3];
export function deepValue<
T extends object,
P1 extends keyof T,
P2 extends keyof T[P1],
P3 extends keyof T[P1][P2],
P4 extends keyof T[P1][P2][P3]
>(value: T, ...path: Path<[P1, P2, P3, P4]>): T[P1][P2][P3][P4];
export function deepValue<
T extends object,
P1 extends keyof T,
P2 extends keyof T[P1],
P3 extends keyof T[P1][P2],
P4 extends keyof T[P1][P2][P3],
P5 extends keyof T[P1][P2][P3][P4]
>(value: T, ...path: Path<[P1, P2, P3, P4, P5]>): T[P1][P2][P3][P4][P5];
export function deepValue<
T extends object,
P1 extends keyof T,
P2 extends keyof T[P1],
P3 extends keyof T[P1][P2],
P4 extends keyof T[P1][P2][P3],
P5 extends keyof T[P1][P2][P3][P4],
P6 extends keyof T[P1][P2][P3][P4][P5]
>(value: T, ...path: Path<[P1, P2, P3, P4, P5, P6]>): T[P1][P2][P3][P4][P5][P6];
export function deepValue<
T extends object,
P1 extends keyof T,
P2 extends keyof T[P1],
P3 extends keyof T[P1][P2],
P4 extends keyof T[P1][P2][P3],
P5 extends keyof T[P1][P2][P3][P4],
P6 extends keyof T[P1][P2][P3][P4][P5],
P7 extends keyof T[P1][P2][P3][P4][P5][P6]
>(
value: T,
...path: Path<[P1, P2, P3, P4, P5, P6, P7]>
): T[P1][P2][P3][P4][P5][P6][P7];
export function deepValue<
T extends object,
P1 extends keyof T,
P2 extends keyof T[P1],
P3 extends keyof T[P1][P2],
P4 extends keyof T[P1][P2][P3],
P5 extends keyof T[P1][P2][P3][P4],
P6 extends keyof T[P1][P2][P3][P4][P5],
P7 extends keyof T[P1][P2][P3][P4][P5][P6],
P8 extends keyof T[P1][P2][P3][P4][P5][P6][P7]
>(
value: T,
...path: Path<[P1, P2, P3, P4, P5, P6, P7, P8]>
): T[P1][P2][P3][P4][P5][P6][P7][P8];
export function deepValue<T, P>(value: T, ...path: Path<P[]>) {
for (const key of path.join().split('.')) value = value[key];
return value;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment