Есть модель 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 создать модель, ссылающуюся на саму себя?