typescript / expert
Snippet
Typsichere Extraktion von tief verschachtelten Eigenschaftspfaden
Dieses Beispiel zeigt eine rekursive Typ-Berechnung mittels Template-Literals, um punktseparierte Pfad-Strings für tief verschachtelte Objektstrukturen zur Kompilierzeit zu generieren. Dies bietet vollständige Typsicherheit beim Zugriff auf geschachtelte Eigenschaften, da nur gültige Pfade akzeptiert werden und der Rückgabetyp exakt dem Ziel-Wert entspricht.
snippet.ts
typescript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
type Primitive = string | number | boolean | bigint | symbol | null | undefined;type PropertyPath<T> = T extends Primitive? never: {[K in keyof T & (string | number)]: T[K] extends Primitive? `${K}`: `${K}` | `${K}.${PropertyPath<T[K]>}`;}[keyof T & (string | number)];type PathValue<T, P extends string> = P extends `${infer Head}.${infer Tail}`? Head extends keyof T? PathValue<T[Head], Tail>: never: P extends keyof T? T[P]: never;function getDeepValue<T, P extends PropertyPath<T>>(obj: T, path: P): PathValue<T, P> {const keys = (path as string).split('.');let current: any = obj;for (const key of keys) {current = current?.[key];}return current;}
Erklärung
1
type PropertyPath<T> = T extends Primitive
Prüft, ob der Zieltyp primitiv ist, um die rekursive Pfadsuch-Operation zu beenden.
2
: `${K}` | `${K}.${PropertyPath<T[K]>}`;
Erstellt rekursiv Template-Literal-Strings durch Verknüpfung von Schlüsselnamen mit Punkten.
3
type PathValue<T, P extends string> = P extends `${infer Head}.${infer Tail}`
Verwendet das infer-Schlüsselwort in bedingten Typen, um Pfad-Strings am Punkt zu zerlegen und rekursiv den inneren Typ zu ermitteln.
4
function getDeepValue<T, P extends PropertyPath<T>>(obj: T, path: P): PathValue<T, P>
Beschränkt den Pfad-Parameter auf gültige PropertyPath-Werte und leitet den Rückgabetyp über PathValue ab.