Как в TypeScript валедировать json с помощью interface?

Как можно проверить JSON сериализованную строку, на соответствие интерфейсу ?

В Python есть https://docs.pydantic.dev/ которая делает то что мне нужно, но вот в TypeScript не нахожу достойные варианты.

Например, я хочу чтобы это работало так:

// Объявляю интерфейс
interface TClient {
    name: string;
    id: number;
}
// Я получаю откуда-то JSON строку
in_data = '{ name: "stackoverflow", id: 1 }';
// Я выполняю валидацию строки. Если ошибка то будет undefined
ВалидныйJSON = МагическаяФункцияДляВалидации(in_data, TClient);
if (ВалидныйJSON !== undefined) {
    // Я использую валидный JSON
    console.log(ВалидныйJSON.name);
} else {
    console.error("Ошибка валидации");
}

Я знаю, interface после компиляции не существует в .js файле. Но если бы я создавал такую библиотеку, то я бы нашел способ хранить interface(или его аналогичную копию), чтобы производить по нему валидацию.


Ответы (1 шт):

Автор решения: ectuser

Typescript не предоставляет функционала для проверки на соответствие интерфейсу в рантайме, так как обычно TS-код собирается в Javascript, где интерфейсы пропадают, так как не являются частью языка.

На данный момент есть несколько библиотек для проверки на соответствие схеме. От себя могу порекомендовать zod

В вашем случае код будет выглядеть следующим образом:

import { z } from "zod";

const TClientSchema = zod.object({
  name: zod.string(),
  id: zod.string(),
});

// extract the inferred type
type TClient = zod.infer<typeof TClientSchema>;

const inData = {name:"stackoverflow", id:1};

try {
  TClientSchema.parse(inData, {});

  // do something
} catch (error) {
  // error
}

Удачи!

→ Ссылка