keyval api

keyval это вариант для хранения элементов в виде массива (нужно ли делать позже объединение с record вариантом пока не очевидно)

Может работать в двух режимах:

No model

Упрощенный вариант без модели, предоставляет только сам апи для работы с коллекциями

const entities = keyval<Field>({
  key: 'name',
  source?: {
    keyval: Keyval<any, State, any>,
    init: (entity: State) => Field
  }
});

Принимаемые параметры

key: Строка которая обозначает поле в модели которое станет ключом для обращения к элементу или функция для вычисления этого ключа элемента, принимает Input объект, возвращает число или строку, результат будет использоваться как ключ для данного элемента коллекции. Для каждого элемента вызывается только один раз.

source: опциональное поле для создания синхронизированного Keyval, принимает два параметра:

keyval: Keyval на основе которого будут создаваться элементы данного

init: функция для создания нового элемента коллекции. Принимает элемент исходной коллекции и возвращает элемент данной

Возвращаемые параметры

Возвращает объект Keyval

With model

const fieldList = keyval({
  key: 'name',
  props: {
    name: define.store<string>(),
    value: define.store<string>(),
  },
  create({ value }) {
    const $isValid = combine(value, (value) => value.length > 0);
    return {
      isValid: $isValid,
    };
  },
  source?: {
    keyval: Keyval<any, State, any>,
    init: (entity: State, params: Partial<Init>) => Init
  }
});
/*
=> Keyval<
  {name: string; value: string},
  {name: string; value: string; isValid: boolean}
>
*/

Вариант с моделью, которая дополняет (enhance) данные новыми полями, то есть каждый элемент коллекции будет расширен теми полями, которые возвращает тело модели

Типы

Тип элемента складывается из двух частей, Input и Entity

Input: объект, который принимается при создании новых элементов, исходные данные для работы модели

Entity: объект, сформированный добавлением к Input объекту новых полей, которыми управляет переданная модель