Проверяем данные схемой
Одна схема задаёт проверку во время работы и тип TypeScript.
SchemaDecoder проверяет вход и возвращает данные нужной структуры.
В schemas.ts ширина и высота поля проверяются как положительные целые числа. Для примера выделим эту проверку в BoardSchema:
import { SchemaDecoder } from '@gamedevland/engine/validation';
import type { InferDecoded } from '@gamedevland/engine/validation';
export class BoardSchema {
static readonly decoder = SchemaDecoder.object({
width: SchemaDecoder.number({ integer: true, min: 1 }),
height: SchemaDecoder.number({ integer: true, min: 1 }),
});
}
export type BoardConfig = InferDecoded<typeof BoardSchema.decoder>;
InferDecoded выводит тип из схемы: отдельный интерфейс с теми же полями не нужен.
Теперь проверим данные из JSON:
const board = SchemaDecoder.decode(raw, BoardSchema.decoder, 'board.json');
raw здесь — вход типа unknown. Метка board.json помогает найти источник ошибки.
Комбинаторы object, readonlyArray, string, number, boolean, record, optional и enumOf позволяют описать вложенные структуры. Ограничения описывают допустимые значения: например, номер слота — целое число от 0 до 2. Проверку «фигура помещается в свободные клетки» выполняет доменная модель, потому что она зависит от текущего поля.