Когда вы получаете непроверенные данные (например, из JSON, API, локального хранилища), обычные типы TypeScript никак не защищают вас от ошибок времени выполнения.
😶🌫️ Runtypes позволяют валидировать такие данные на лету, описывая структуру через валидаторы, а не просто типы.
😶🌫️ Пример
Типы на TypeScript:
type Vector = [number, number, number]
type Planet = { type: "planet", location: Vector, mass: number, population: number, habitable: boolean }
Валидация через Runtypes:
import { Number, Boolean, Tuple, Literal, Object } from 'runtypes'
const Vector = Tuple(Number, Number, Number)
const Planet = Object({
type: Literal("planet"),
location: Vector,
mass: Number,
population: Number,
habitable: Boolean,
})Проверка данных:
Planet.check(someValue) // выбросит ошибку, если структура не совпадает
Если структура не соответствует ожидаемой:
— выбрасывается
ValidationError— доступен объект
failure с подробностями:➡️ где именно ошибка
➡️ что ожидалось и что получено
➡️ можно использовать для i18n и UI
😶🌫️ Что поддерживает Runtypes
— Примитивы
— Объекты и массивы
— Кортежи
— Объединения (
Union)— Пересечения (
Intersect)— Пользовательские ограничения (например, длина массива)
— Валидация вложенных структур
😶🌫️ Когда пригодится
— Проверка данных из API, JSON, UI
— Сложная вложенная структура, которую нужно валидировать
— Автогенерация UI и ошибок
— Безопасность в рантайме (а не только на этапе компиляции)
🔗 GitHub: https://clc.to/H_xiTA
Библиотека питониста #буст
