typescript / intermediate
Snippet
Tiefgehende Unveränderlichkeit durch zugewiesene Typen und Object.freeze
Die Kombination aus rekursiven zugewiesenen Typen und rekursivem Object.freeze zur Laufzeit gewährleistet vollständige Unveränderlichkeit sowohl zur Kompilierzeit als auch zur Laufzeit.
snippet.ts
typescript
1
2
3
4
5
6
7
8
9
10
11
12
13
type Immutable<T> = {readonly [K in keyof T]: T[K] extends object ? Immutable<T[K]> : T[K];};function secureFreeze<T extends object>(obj: T): Immutable<T> {Object.keys(obj).forEach(key => {const prop = (obj as Record<string, any>)[key];if (typeof prop === "object" && prop !== null) {secureFreeze(prop);}});return Object.freeze(obj) as Immutable<T>;}
Erklärung
1
readonly [K in keyof T]: T[K] extends object ? Immutable<T[K]> : T[K];
Wendet den readonly-Modifikator rekursiv auf alle verschachtelten Eigenschaften an.
2
if (typeof prop === "object" && prop !== null) { secureFreeze(prop); }
Durchläuft verschachtelte Strukturen, um untergeordnete Objekte zur Laufzeit rekursiv einzufrieren.
3
return Object.freeze(obj) as Immutable<T>;
Friert den äußeren Behälter ein und wandelt den Rückgabewert in den tief unveränderlichen Typ um.