Ключевое слово type

Назначение ключевого слова type

Ключевое слово type в JSON Schema определяет тип данных, которому должно соответствовать проверяемое значение. В библиотеке Ajv это одно из базовых и наиболее часто используемых ограничений, так как именно оно формирует первичный уровень валидации структуры данных.

Поддерживаемые типы соответствуют спецификации JSON:

  • string — строка
  • number — число (включая дробные значения)
  • integer — целое число
  • boolean — логическое значение
  • object — объект
  • array — массив
  • null — пустое значение

Простейшее применение выглядит следующим образом:

{
  "type": "string"
}

Такое правило означает, что валидным считается только строковое значение, любое другое будет отклонено валидатором.


Проверка базовых типов в Ajv

При использовании Ajv схема передаётся в компилятор, который превращает её в оптимизированную функцию проверки. Ключевое слово type в этом процессе становится одним из первых фильтров.

Пример:

import Ajv from "ajv";

const ajv = new Ajv();

const schema = {
  type: "number"
};

const validate = ajv.compile(schema);

validate(42);     // true
validate("42");   // false

Проверка выполняется строго: строка "42" не считается числом, даже если может быть приведена к нему.


Строгая типизация и поведение Ajv

Ajv по умолчанию следует строгой интерпретации типов JSON Schema. Это означает отсутствие неявного преобразования данных.

Пример различий:

validate(1);      // true
validate("1");    // false

Однако библиотека поддерживает режимы, влияющие на обработку типов:

  • coerceTypes
  • strictTypes
  • removeAdditional

Приведение типов (coerceTypes)

При включении параметра возможно автоматическое преобразование:

const ajv = new Ajv({ coerceTypes: true });

const schema = { type: "number" };
const validate = ajv.compile(schema);

validate("123"); // true (строка преобразована в число)

Внутренне строка "123" преобразуется в число 123 перед проверкой.


Использование массива типов

JSON Schema допускает указание нескольких типов одновременно:

{
  "type": ["string", "null"]
}

Такое определение означает допустимость либо строки, либо null.

В Ajv это используется для моделей, где значение может отсутствовать:

const schema = {
  type: ["object", "null"]
};

Это распространённый подход при работе с API-ответами, где поле может быть опциональным.


Взаимодействие type с другими ключевыми словами

Ключевое слово type редко используется изолированно. Обычно оно комбинируется с другими ограничениями:

string + ограничения длины

{
  "type": "string",
  "minLength": 3,
  "maxLength": 10
}

number + диапазон значений

{
  "type": "number",
  "minimum": 0,
  "maximum": 100
}

object + свойства

{
  "type": "object",
  "properties": {
    "id": { "type": "integer" },
    "name": { "type": "string" }
  },
  "required": ["id"]
}

Здесь type: "object" задаёт базовую структуру, а остальные ключи уточняют её содержимое.


Особенности проверки object и array

Объекты

Для object проверка включает:

  • соответствие типу объекта
  • отсутствие несовместимых значений (например, массивов вместо объектов)
  • проверку свойств при их наличии
validate({});        // true
validate([]);        // false
validate(null);      // false

Массивы

Для array Ajv проверяет:

  • является ли значение массивом
  • соответствие элементов дополнительной схеме (если указана)
{
  "type": "array",
  "items": { "type": "number" }
}

Поведение при несовпадении типов

При несоответствии type валидация завершается с ошибкой без дальнейшей проверки вложенных правил.

Пример:

{
  "type": "string",
  "minLength": 5
}

Если передано число:

42

то правило minLength не проверяется, так как тип уже не соответствует.


Работа с null как типом

Тип null в JSON Schema имеет особую роль. Он обозначает исключительно значение null:

{
  "type": "null"
}

Использование:

  • явное обозначение отсутствия данных
  • моделирование необязательных значений

Часто комбинируется:

{
  "type": ["string", "null"]
}

Строгий режим Ajv и type

В строгом режиме Ajv усиливает контроль над корректностью схемы:

  • запрещает некорректные значения type
  • предупреждает о неоднозначных определениях
  • требует соответствия спецификации JSON Schema Draft

Пример некорректной схемы:

{
  "type": "strng"
}

В строгом режиме такая схема будет считаться ошибочной.


Производительность проверки type

Ключевое слово type является одной из самых быстрых проверок в Ajv, поскольку:

  • выполняется до остальных ограничений
  • компилируется в простую JavaScript-проверку typeof
  • исключает лишние вычисления при несовпадении

Пример внутренней логики:

typeof data === "string"

или

Array.isArray(data)

Типизация в сложных схемах

В больших схемах type часто используется на каждом уровне вложенности:

{
  "type": "object",
  "properties": {
    "user": {
      "type": "object",
      "properties": {
        "id": { "type": "integer" },
        "profile": {
          "type": "object",
          "properties": {
            "age": { "type": "integer" }
          }
        }
      }
    }
  }
}

Такая структура позволяет формировать строгие контракты данных, особенно в API и микросервисной архитектуре.


Комбинирование type с anyOf, oneOf, allOf

Ключевое слово может использоваться внутри логических конструкций:

{
  "oneOf": [
    { "type": "string" },
    { "type": "number" }
  ]
}

Здесь type определяет альтернативные допустимые формы данных.


Итоговая роль type в системе валидации

Ключевое слово type выполняет фундаментальную функцию первичной фильтрации данных. В Ajv оно является базовой точкой входа для дальнейшей проверки схемы, определяя допустимую природу значения и влияя на всю последующую логику валидации.