TGViewer
Павел Мажуга | Frontend Developer Павел Мажуга | Frontend Developer @mazhugagl · 373 subscribers
Post #155 132
Как в TypeScript типизировать внешние данные (fetch JSON, куки, localStorage и т.п.)

Любой внешний payload на входе, например фетч или импорт JSON, по молчанию имеет тип any. Что мы обычно делаем? Правильно, кастим тип:


type PageResponse = {
status: "success" | "error";
data?: { contentHtml?: string; nextPageUrl?: string };
};

const json = (await response.json()) as PageResponse;


Но кастить тип через as равно врать компилятору.

TypeScript мы заткнули, только рантайм про контракт ничего не знает. Если формат поменялся, создается потенциальный баг в приложении.

Чтобы не врать, контракт нужно описать один раз и прогнать через него данные на границе. Для этого можно использовать Zod: схема валидирует в рантайме и сужает тип. Это называют "type narrowing через runtime parser": unknown/any -> parse -> конкретный тип.


const pageDataSchema = z.object({
contentHtml: z.string().optional(),
nextPageUrl: z.string().optional(),
});

const parsePageResponse = (raw: unknown) =>
z
.object({
status: z.enum(["success", "error"]),
message: z.string().optional(),
data: pageDataSchema.optional(),
})
.parse(raw);

type PageResponse = ReturnType<typeof parsePageResponse>;

const json = parsePageResponse(await response.json());


Тип ответа берём из ReturnType парсера (или из схемы через z.infer), а не пишем отдельно руками (не хардкодим).

Тот же приём работает не только для JSON: куки, query, localStorage, postMessage, FormData - всё, что пришло "извне".

Научите ваших агентов.
  • 🔥 5
  • 😈 2
More from @mazhugagl
  1. Oct 9, 2026Код больше ничего не стоит. А разработчики? Вышел шестой выпуск ЛОМОВА. В гостях Глеб Михе…
  2. Oct 9, 2026Глеб выдал базу про то, что будет с профессией разработчика в AI эру (все не так плохо). Р…
  3. Oct 6, 2026Программисты - В С Ё Все разработчики теперь по большей части менеджеры, архитекторы и сис…
  4. Sep 2, 2026Бруно Симон выпустил курс по TSL. Со скидкой для тех у кого куплен Three.js Journey. Думай…
  5. Jul 13, 2026Flowmap Live: https://pavelmazhuga.com/lab/flowmap/ Source code: https://github.com/pavel-…
  6. Jul 1, 2026https://specification.website/ Спецификация технических деталей, которые должны быть реали…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →