typescript / intermediate
Snippet
Deep Immutability Protection using Mapped Types and Object.freeze
Combining recursive mapped types with recursive runtime Object.freeze ensures complete immutability both at compile-time and runtime, protecting sensitive system states from mutation.
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>;}
Breakdown
1
readonly [K in keyof T]: T[K] extends object ? Immutable<T[K]> : T[K];
Recursively applies the readonly modifier to all nested properties.
2
if (typeof prop === "object" && prop !== null) { secureFreeze(prop); }
Traverses nested structures to freeze child objects recursively at runtime.
3
return Object.freeze(obj) as Immutable<T>;
Freezes the outer container and casts the return value to the deeply immutable type.