Ошибка при преобразовании `undefined` в` map<string, AnonymousModel>`

Я пытаюсь создать очень простое вложенное хранилище с помощью mobx-state-tree и не могу понять, как заставить его работать. Либо эта библиотека невероятно не интуитивна, либо я просто упускаю что-то очевидное. Я пытался обернуть все в MST.types.optional() чтобы увидеть, если это имеет значение, но нет.

Идея состоит в том, что в магазине заказов есть много заказов на покупку и продажу. Я хочу создать пустой магазин без каких-либо заказов.

Когда я пытаюсь выполнить Orders.js, я получаю следующую ошибку:

Error: [mobx-state-tree] Error while converting `undefined` to `map<string, AnonymousModel>`: value `undefined` is not assignable to type: `map<string, AnonymousModel>` (Value is not a plain object), expected an instance of `map<string, AnonymousModel>` or a snapshot like `Map<string, { timestamp: Date; amount: number; price: number }>` instead.`

order.js

const MST = require("mobx-state-tree")

const Order = MST.types.model({
    timestamp: MST.types.Date,
    amount: MST.types.number,
    price: MST.types.number,
}).actions(self => {
    function add(timestamp, price, amount) {
        self.timestamp = timestamp
        self.price = price
        self.amount = amount
    }
    return { add }
})

module.exports = Order

orders.js

const MST = require("mobx-state-tree")
const Order = require('./order')

const Orders = MST.types.model({
    buys: MST.types.map(Order),
    sells: MST.types.map(Order),
}).actions(self => {
    function addOrder(type, timestamp, price, amount) {
        if(type === 'buy'){
            self.buys.add(timestamp, price, amount)
        } else if(type === 'sell') {
            self.sells.add(timestamp, price, amount)
        } else throw Error('bad order type') 
    }
    return { addOrder }
})
Orders.create()

1 ответ

Решение

Да, вам нужно обернуть все как types.optional и предоставить для этого снимок по умолчанию. Вот пример

const MST = require("mobx-state-tree")
const Order = require('./order')

const Orders = MST.types.model({
    buys: MST.types.optional(MST.types.map(Order), {}),
    sells: MST.types.optional(MST.types.map(Order), {}),
}).actions(self => {
    function addOrder(type, timestamp, price, amount) {
        if(type === 'buy'){
            self.buys.add(timestamp, price, amount)
        } else if(type === 'sell') {
            self.sells.add(timestamp, price, amount)
        } else throw Error('bad order type') 
    }
    return { addOrder }
})
Orders.create()

То, что делает types.optional за сценой, - это intercept undefined и замените его значением по умолчанию:)

Другие вопросы по тегам