Вопрос проверяет понимание того, как копирование объектов через JSON-методы влияет на типизацию TypeScript и может привести к потере информации о типах.
В TypeScript типы существуют только на этапе компиляции и "стираются" при выполнении кода. Методы JSON.stringify() и JSON.parse() работают со значениями во время выполнения, не учитывая систему типов TypeScript.
После десериализации TypeScript видит объект как обычный литерал объекта. Если не предоставить явную аннотацию типа или утверждение типа, компилятор выведет широкий тип, основанный на структуре JSON, что может привести к ошибкам типизации.
Рассмотрим класс и его копирование:
class User {
constructor(public name: string, public age: number) {}
greet() { return `Hello, ${this.name}`; }
}
const original = new User('Alice', 30);
// TypeScript знает, что original - экземпляр User
const jsonCopy: any = JSON.parse(JSON.stringify(original));
// jsonCopy теперь простой объект { name: 'Alice', age: 30 }
// Тип: any (мы указали явно, но можно было бы использовать unknown)
// Метод greet() потерян!
// console.log(jsonCopy.greet()); // Ошибка выполнения: greet не функция
// Без аннотации TypeScript выведет тип { name: string; age: number; }
const inferredCopy = JSON.parse(JSON.stringify(original));
// inferredCopy имеет тип { name: string; age: number; }, а не User.Чтобы TypeScript правильно понимал тип после копирования, нужно явно указать его:
const copy = JSON.parse(JSON.stringify(orig)) as User; (осторожно, это может быть небезопасно).JSON-копирование — это быстрый способ глубокого копирования простых объектов данных (POJO), но оно полностью игнорирует систему типов TypeScript и теряет мета-информацию (методы, прототипы). Используйте его для данных без поведения, а для сложных объектов с методами применяйте другие методы клонирования или явно восстанавливайте типы после десериализации.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию