9

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

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

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

有些商店可以提供额外的功能,所以我写了

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

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

错误:[mobx-state-tree] 转换时出错 ...
EntityStore 类型的值:(id:Order)> 不可分配给 type: EntityStore
需要一个实例EntityStore或类似 ... 的快照
(请注意,快照提供的值与目标类型兼容)

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

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

4

1 回答 1

10

不,你不能。因为.views()(基本上与任何其他点方法一样)每次调用它时都会创建一个全新的对象。 ModelType

你可以做的是使用一个union类型:

  • types.union(options?: { dispatcher?: (snapshot) => Type, eager?: boolean }, types...)创建多种类型的联合。如果无法从快照中明确推断出正确的类型,请提供调度程序函数来确定类型。当 eager 标志设置为 true(默认)时 - 将使用第一个匹配类型,如果设置为 false,则类型检查将仅在恰好 1 个类型匹配时通过。

下面还有一个示例,说明如何使用类型组合来模拟继承

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)

所以,没有继承,但是,联合类型和代码重用

于 2019-03-02T07:41:20.457 回答