26 lines
676 B
TypeScript
26 lines
676 B
TypeScript
import { DeeplyReadonly } from "./types";
|
|
|
|
/**
|
|
* Recursively freezes an object by iterating over all properties and freezing them.
|
|
* @param obj - The object to freeze.
|
|
* @returns The frozen object.
|
|
*/
|
|
export const deepFreeze = <T>(value: T): DeeplyReadonly<T> => {
|
|
if (
|
|
value !== null &&
|
|
(typeof value === 'object' || typeof value === 'function')
|
|
) {
|
|
for (const key of Reflect.ownKeys(value)) {
|
|
const descriptor = Reflect.getOwnPropertyDescriptor(value, key);
|
|
|
|
if (descriptor && 'value' in descriptor) {
|
|
deepFreeze(descriptor.value);
|
|
}
|
|
}
|
|
|
|
Object.freeze(value);
|
|
}
|
|
|
|
return value;
|
|
}
|