Как в 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 шт):
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
}
Удачи!