Как мы все знаем, проверки типов TypeScript только во время компиляции.
Существует несколько существующих подходов для добавления проверок во время выполнения, таких как io-ts , но я ' Мне осталось только подумать, есть ли более простой способ.
Например, плагин Babel, который передал бы это:
type Todo = {
userId: number;
id: number;
title: string;
completed: boolean;
}
const resp = await fetch("https://jsonplaceholder.typicode.com/todos/1");
const data = await resp.json();
assert(data typeof Todo);
на это:
const __TodoType = {
userId: Number;
id: Number;
title: String;
completed: Boolean;
};
const __isTodoType = obj => (
obj &&
obj.constructor === Object &&
Object.keys(obj).length === Object.keys(__TodoType).length &&
Object.entries(obj)
.every(([prop, val]) =>
__TodoType[prop] && val &&
__TodoType[prop] === val.constructor)
);
const resp = await fetch("https://jsonplaceholder.typicode.com/todos/1");
const data = await resp.json();
assert(__isTodoType(data));
Это было бы будет очень простым решением и будет охватывать многие (если не большинство) варианты использования. AFAICT, этого было бы достаточно для утверждения сериализации / выборки данных.
Кто-то сумел создать такой плагин Babel?
Edit - Я знаю существующие библиотеки, такие как io но я ищу что-то гораздо более простое. Плагин Babel, который я демонстрирую, намного проще (с точки зрения пользователя плагина), чем все остальное, что я видел до сих пор. Я не уверен, почему это не было сделано раньше.