【发布时间】:2021-08-15 17:36:30
【问题描述】:
我有一个简单的 Grocery Shopping 应用程序,我想在其中使用 Set(),但是当我尝试使用 Set() 时出现各种错误。我正在使用 MobX 和 TypeScript。
types.ts
export type Item = {
name: string;
instock: number;
price: number;
};
export type Buyer = {
cash: number;
items: Array<Pick<Item, 'name'> & { quantity: number }>;
};
export type IStore = {
items: Item[];
buyer: Buyer;
};
store.ts
import { observable, action, set, computed, makeObservable } from 'mobx';
import type { Item, IStore, Buyer } from './types';
export class Store implements IStore {
items: Item[] = [
{
name: "Egg",
instock: 30,
price: 4
},
{
name: "Apple",
instock: 24,
price: 20
},
{
name: "Banana",
instock: 60,
price: 8
}
]
buyer: Buyer = {
cash: 50,
items: [],
}
constructor() {
makeObservable(this, {
items: observable,
buyer: observable,
buyItem: action.bound,
});
}
buyItem(name: string, price: number, quantity: number) {
if (this.buyer.cash - price * quantity > 0) {
this.buyer.items.push({ name, quantity })
this.buyer.cash = this.buyer.cash - price * quantity
}
}
}
export const store = new Store();
我想将buyer 设为Set()。例如,types.ts 应该将buyer 变成:
.
.
.
export type IStore = {
.
.
.
buyer: new Set<Buyer>();
};
同样,我应该可以更改store.ts。 The docs 没有完整的示例。我该怎么做?
Stackblitz 复制 → https://stackblitz.com/edit/react-mobx-set-not-working?file=store.ts
【问题讨论】:
-
所以我有 2 个问题,你已经尝试过什么以及你遇到了什么样的错误?另外,你为什么要对
buyer使用 Set 呢? Set 就像一个数组,而您的应用程序中的buyer是一个带有字段的对象,您如何将cash存储在一个Set 中? -
@Danila 我尝试在
types.ts中执行new Set<Buyer>(),因为我认为我还需要更改types文件。它给出了一个错误'(' expected.(1005)。是的,我想我需要将items设置为Set(),因为我想在使用buyItem购买物品时存储物品的name,例如Egg并增加quantity,这样就解决了一半的问题。我刚刚阅读了Set文档,它确实显示可以使用对象。但是知道如何在 MobX 中使用Set仍然会有所帮助吗? -
我还是不明白为什么你甚至需要在这里设置?如果您希望买家物品成为套装,那么这里是 stackblitz.com/edit/…,但在我看来,几乎没有理由将其设为套装
-
@Danila 你是对的。我希望它像字典一样,但后来意识到我必须保持
items独特和quantity不断增加,所以我想到了Set。最终,我只是选择了map,并检查了.has(),只保留独特的物品。
标签: javascript typescript set mobx mobx-react