SchemaDecoder08 / 12

Проверяем данные схемой

Одна схема задаёт проверку во время работы и тип 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 выводит тип из схемы: отдельный интерфейс с теми же полями не нужен.

01
unknownНапример, { width: 8, height: "8" }
02
SchemaDecoder.decodeПроверяет поля, типы и ограничения
03
Результат или ошибкаСтрока "8" не становится числом автоматически
Декодирование проверяет структуру данных. Домен игры позже проверит допустимость самого хода.

Теперь проверим данные из JSON:

const board = SchemaDecoder.decode(raw, BoardSchema.decoder, 'board.json');

raw здесь — вход типа unknown. Метка board.json помогает найти источник ошибки.

Комбинаторы object, readonlyArray, string, number, boolean, record, optional и enumOf позволяют описать вложенные структуры. Ограничения описывают допустимые значения: например, номер слота — целое число от 0 до 2. Проверку «фигура помещается в свободные клетки» выполняет доменная модель, потому что она зависит от текущего поля.

Источники ↗

Block Puzzle · event.schemas.ts↗Граница между формой запроса и правилами размещения.