PassFront
  1. PassFront
  2. База знаний
  3. Типы и интерфейсы

Как восстановить переданный из одной TypeScript программы в другую объект в JSON чтобы сохранить метаданные?

Типы и интерфейсы

Типы TypeScript в рантайме не существуют, поэтому при передаче объекта через JSON метаданные (типы, классы, Date, Map) теряются. Восстанавливают их явной сериализацией и валидацией.

Что теряется

  • экземпляры классов становятся обычными объектами без методов;
  • Date превращается в строку;
  • Map, Set, BigInt, undefined не сериализуются как есть.

Как восстановить

  • Схема валидации — проверка и преобразование данных на входе:
import { z } from 'zod';

const User = z.object({
  id: z.string(),
  createdAt: z.coerce.date(),
});
type User = z.infer<typeof User>;

const user = User.parse(JSON.parse(raw)); // createdAt снова Date
  • Явные функции сериализации — toJSON() и fromJSON() у класса.
  • reviver в `JSON.parse` — преобразование значений по ключу.
  • Библиотеки — superjson, class-transformer (сохраняют Date, Map и классы через метаданные).

Чего не делать

Просто писать JSON.parse(raw) as User — компилятор поверит, но данные не проверены.

Коротко для собеседования

Типы в JSON не переносятся; данные валидируют и преобразуют на входе (zod, reviver, fromJSON, superjson), а не приводят через as.

Подробнее: zod — Документация

Другие вопросы раздела