Перейти к содержанию

Типизация переменных

Типизация постепенная: необъявленная переменная не проверяется, секции типов необязательны.

{
  "types": {
    "UserId": "int",
    "User": {
      "id": "UserId",
      "name": "string",
      "email?": "string",
      "settings": { "theme": "string" }
    },
    "Point": { "fields": { "x": "int", "y": "int" }, "strict": true },
    "Tree":  { "value": "int", "children": "list<Tree>" }
  },
  "variables": { "user": "User", "attempts": "int", "tags": "list<string>" }
}

Язык типов: примитивы string, int, float, number (int|float), bool, any, null; контейнеры list<T> и map<T> (ключи строковые); объединения T|U; сокращение T? = T|null; имена из секции types. Структуры поддерживают опциональные поля (суффикс ? у имени), вложенные анонимные структуры, рекурсию и строгий режим (strict запрещает лишние поля).

Проверки двухслойные:

  • статически, при валидации графа: объявленный тип переменной сверяется с хинтами из спецификации стадии, expose требует совместимости источника и назначения; несовместимость — ошибка Pipeline.validate() до запуска;
  • динамически, при исполнении: каждая запись в объявленную переменную (entry, outputs, expose, except.result_var, артефакты субпайплайна) и входной контекст сессии проверяются по полной структуре значения; ошибка — TypeCheckError с узлом и путём до несовпадения.

Субпайплайн наследует именованные типы родителя и может объявить свои; типы переменных у него собственные.

Обе секции правятся в редакторе, «File» → «Pipeline settings…»:

Именованные типы и типы переменных в редакторе