Как восстановить переданный из одной 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 — Документация