typescript / expert
Snippet
Tief verschachtelte Eigenschaftspfad-Auflösung über rekursive Template-Literal-Typen
Dieses Snippet implementiert eine typbasierte, rekursive Pfadextraktion zur Kompilierzeit mittels Template-Literal-Typen. `Path<T>` erzeugt eine Union gültiger Punkt-separierter Schlüsselstring-Pfade. `DeepGet<T, P>` zerlegt den Pfadstring zur Kompilierzeit per String-Mustervergleich (`infer`) und ermittelt präzise den Rückgabetyp der verschachtelten Eigenschaft ohne manuelle Typumwandlung.
snippet.ts
typescript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
type Path<T> = T extends object? { [K in keyof T & (string | number)]: K extends string ? `${K}` | `${K}.${Path<T[K]>}` : never }[keyof T & (string | number)]: never;type DeepGet<T, P extends string> = P extends `${infer K}.${infer Rest}`? K extends keyof T ? DeepGet<T[K], Rest> : never: P extends keyof T ? T[P] : never;interface Configuration {database: { connection: { host: string; port: number } };}function getNestedConfig<T extends object, P extends Path<T>>(obj: T, path: P): DeepGet<T, P> {return path.split('.').reduce((acc: any, key) => acc?.[key], obj);}const config: Configuration = { database: { connection: { host: "localhost", port: 5432 } } };const port = getNestedConfig(config, "database.connection.port");
Erklärung
1
type Path<T> = T extends object ? { [K in keyof T & (string | number)]: K extends string ? `${K}` | `${K}.${Path<T[K]>}` : never }[keyof T & (string | number)] : never;
Baut rekursiv eine Union aller verfügbaren Punkt-notierten Eigenschafts-Pfade für das Objekt T auf.
2
type DeepGet<T, P extends string> = P extends `${infer K}.${infer Rest}` ? K extends keyof T ? DeepGet<T[K], Rest> : never : P extends keyof T ? T[P] : never;
Navigiert mithilfe von Template-Literal-Mustervergleichen und infer rekursiv durch die Objektstruktur entlang des Pfades P.
3
function getNestedConfig<T extends object, P extends Path<T>>(obj: T, path: P): DeepGet<T, P>
Beschränkt das Pfad-Argument P auf valide Pfade und verknüpft den Rückgabetyp direkt mit dem abgeleiteten Pfadtyp.