Задать вопрос

Как в Mobx State Tree сделать self-reference?

Есть модель ProductCategory, в которой могут быть вложены другие категории. В общем-то это types.reference, но для простоты пусть это просто будет массив дочерних категорий с точно такими же полями. Делаю так:
const ProductCategory = types.model('ProductCategory', {
  id: types.identifier,
  title: types.string,
  description: types.maybeNull(types.string),

  parent: types.maybeNull(types.string),

  // @todo self-reference
  descendants: types.array(ProductCategory),
});

Что не работает - и немудрено, ведь ProductCategory не определена на момент создания модели. Можно, конечно, вынести описание структуры модели в массив и сделать нечто вроде
const categoryStructure = { ... };
const ProductCategory = types.model('ProductCategory', {
  ...categoryStructure,

  descendants: types.array(types.model(categoryStructure)),
});

Но, как вы понимаете, это уже не DRY: с этим невозможно будет сделать reference, с этим нельзя будет полагаться на тип модели (ибо будут, по сути, две разные модели для родительской и дочерних категорий, что неприемлемо и ведет к хаосу, т.к. вложенность неограниченна).

Причем я не нашел способа расширить уже созданный тип. Нет ничего похожего на types.extend(Model, additionalFields) или на Model.extendWith(field). При этом описанная мной ситуация сама по себе - распространенный кейс, например, ветки комментариев.

Как в Mobx State Tree создать модель, ссылающуюся на саму себя?
  • Вопрос задан
  • 514 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@OneFive
React.js <3
types.array(types.reference(types.late(() => ProductCategory)))
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы