在Mobx状态树中扩展模型

时间:2019-02-07 05:00:31

标签: mobx-state-tree

我有一堆商店,每个商店都包含一个实体类型的列表,例如

const userStore = EntityStore.create(....)

const supplierStore = EntityStore.create(....)

有些商店可以提供其他功能,所以我写了

const orderStore = EntityStore
.views(self => ({
    allByUserId: branchId => ....)
}))
.create(....)

到目前为止,一切都很好,但是现在我想创建一个“商店管理器”,其中包含所有此类商店的列表,但失败,并显示类似消息

  

错误:[mobx-state-tree]转换...   类型EntityStore:(id:Order)>的值不能分配给类型:EntityStore
  预期EntityStore的实例或...之类的快照
  (请注意,提供的值的快照与目标类型兼容)

该消息很清楚,我的“带有视图的EntityStore”与“ EntityStore”的类型不同。但这是它的扩展,所以我想知道是否有允许它的声明。 Java中的List<? extends EntityStore>之类的东西?

还是一个不错的解决方法,允许我在不更改类型的情况下向EntityStore添加其他功能?

1 个答案:

答案 0 :(得分:2)

不。你不能因为.views()(基本上是其他点方法)每次调用都会创建a whole new ModelType对象。

相反,您可以使用union类型:

  
      
  • types.union(options?: { dispatcher?: (snapshot) => Type, eager?: boolean }, types...)创建多种类型的联合。如果正确   不能从快照明确推断出类型,请提供   确定调度程序功能的类型。当渴望标志设置为   true(默认)-如果设置为false,将使用第一个匹配类型   仅当完全匹配一种类型时,类型检查才会通过。
  •   

下面还有一个如何simulate inheritance by using type composition的示例:

const Square = types
    .model(
        "Square",
        {
            width: types.number
        }
    )
    .views(self => ({
        surface() {
            return self.width * self.width
        }
    }))

// create a new type, based on Square
const Box = Square
    .named("Box")
    .views(self => {
        // save the base implementation of surface
        const superSurface = self.surface

        return {
            // super contrived override example!
            surface() {
                return superSurface() * 1
            },
            volume() {
                return self.surface * self.width
            }
        }
    }))

// no inheritance, but, union types and code reuse
const Shape = types.union(Box, Square)

因此,没有继承,但是并集类型和代码重用