我的结构如下:
--> means is included in (as property):
Item --> ItemStack <--> Inventory
Item: name: string, weight: number, ...
ItemStack: item: Item, amount: number, inventory: Inventory | null
Inventory: items: ItemStack[], capacity: number
Item是某些Item的一般定义。 ItemStack引用了该项目以及其中有多少个项目。但是,一个项目可以是一个背包,一个背包可以有一个清单。因此,ItemStack还具有一个清单作为子文档。然后,库存会存储一个ItemStacks数组。这就是问题所在,因为ItemStack和Inventory不应具有自己的集合,因为它们不在多对多关系中,所以最好将它们存储为子文档。问题来了,因为这可能被视为循环引用,但是永远不会发生。
这就是运行时的样子(从数据库中检索时):
Item {
id: 1,
name: "Apple",
weight: 1
}
Item {
id: 2,
name: "Backpack",
weight: 10
}
InventoryHolder {
Inventory {
capacity: 10,
items: [
Item {
id: 1,
name: "Apple"
},
Item {
id: 2,
name: "Backpack",
inventory: Inventory { // the point of circular reference
items: [] // as many more items in backpacks as needed
}
}
]
}
}
但是,由于库存只能由一个所有者或物品持有或拥有,因此最好将它们存储为子文档。
我现在的问题是如何定义结构的模型,使其像这样工作。
谢谢!
编辑: 我已经尝试使用Typegoose,它可以让我定义模型的类。 根据将它们作为子文档的方式,这就是我试图设置它们的方式:
class TSItem extends Typegoose {
@prop()
name?: string;
@prop()
weight?: number;
@prop()
canHaveInventory?: boolean;
}
class TSItemStack extends Typegoose {
@prop()
item?: TSItem;
@prop()
inventory?: TSInventory;
@prop()
amount?: number;
}
class TSInventory {
items?: TSItemStack[];
capacity?: number;
constructor(){
this.items = [];
this.capacity = 10;
}
}
但是,在编译时,显然会出现此错误:
ReferenceError: TSInventory is not defined
...,因为我正尝试在定义它之前使用它。这就是确切的问题。这些类型本身处于循环关系中,但是将其应用于实际数据时,永远不会发生这种情况。
答案 0 :(得分:0)
仅使用“对象”作为递归/循环引用的类型即可。
之后将要求我进行一些类型转换,但是它可以工作! 似乎无法以其他任何方式解决问题。