我有一堆商店,每个商店都包含一个实体类型的列表,例如
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
添加其他功能?
答案 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)
因此,没有继承,但是并集类型和代码重用。