В современной веб-разработке работа с данными JSON является обычной задачей. Независимо от того, извлекаем ли мы данные из API или читаем конфигурацию, мы часто используем структуры JSON. Но как в статически типизированном мире TypeScript преобразовать эти динамические объекты JSON в экземпляры классов TypeScript? Давайте рассмотрим это подробно.

Зачем приводить JSON к классу TypeScript?

Во-первых, давайте поймем «почему» за этим. Объекты JSON динамичны и гибки, но классы TypeScript предоставляют план для наших данных, обеспечивая структуру и позволяя нам определять методы.

Представьте, что у нас есть данные, представляющие пользователей, и мы также хотим иметь метод для отображения полного имени пользователя. Именно здесь становится полезным приведение JSON к классу.

Базовый кастинг

В простых случаях у вас может возникнуть соблазн использовать утверждения типа TypeScript:

class User {
    name: string;
    age: number;
}

const jsonData = '{"name": "John", "age": 25}';
const user: User = JSON.parse(jsonData) as User;

Это будет проверка типов, но важно понимать, что это не создает экземпляр класса User. Это обычный объект, который TypeScript обрабатывает так, как если бы он имел тип User.

Глубокое литье с конструктором

Чтобы действительно создать экземпляр класса TypeScript из объекта JSON, вы часто будете использовать конструктор класса:

class User {
    name: string;
    age: number;

    constructor(data: any) {
        this.name = data.name;
        this.age = data.age;
    }

    getFullName(): string {
        return this.name;
    }
}

const jsonData = '{"name": "John", "age": 25}';
const user = new User(JSON.parse(jsonData));
console.log(user.getFullName()); // Outputs: John

Автоматизация с помощью Class-transformer

Ручное определение конструкторов для каждого класса может стать громоздким, особенно с вложенными объектами. Спасением здесь может стать библиотека класс-трансформер.

import { plainToClass } from "class-transformer";

class User {
    name: string;
    age: number;

    getFullName(): string {
        return this.name…