Dev Highlights

Доки по разработке

This project is maintained by teniryte

Глубокая неизменяемость вручную

Принципы

Пример

const bill = {
  name: 'Bill',
  profile: { level: 6 },
  scores: [1, 2, 3],
} as const;
// bill.name = 'John'; // Ошибка

function deepFreeze<T>(obj: T): Readonly<T> {
  for (const name of Object.getOwnPropertyNames(obj)) {
    const value = (obj as any)[name];
    if (value && typeof value === 'object') {
      deepFreeze(value);
    }
  }
  return Object.freeze(obj);
}

const frozen = deepFreeze({
  name: 'Bill',
  profile: { level: 1 },
  scores: [90, 65, 80],
} as const);

Практика