Mobx-State-Tree - Назначить тип массива - PullRequest
1 голос
/ 15 апреля 2019

У меня есть эта базовая модель.

const stuff = types.model({
  term: types.string,
  excludeTerm: types.string,
  stores: types.array(types.string)
}).actions(self => ({
  setTerm(term: string) {
    self.term = term
  },
  setExcludeTerm(term: string) {
    self.excludeTerm = term
  },
  setStores(stores: string[]) {
    self.stores = stores   // <<< the lint error is on this line
  }
}))

Я получаю следующую ошибку TS Lint:

Type 'string[]' is not assignable to type 'IMSTArray<ISimpleType<string>> & IStateTreeNode<IArrayType<ISimpleType<string>>>'. Type 'string[]' is missing the following properties from type 'IMSTArray<ISimpleType<string>>': spliceWithArray, observe, intercept, clear, and 4 more.ts(2322)

Это досадная ошибка.Я могу исправить это, назначив так: (self as any).stores = stores, но я хочу прекратить делать хаки с моим кодом.

Вопрос в том, почему я получаю эту ошибку?Есть ли другой способ присвоения типу массива в mobx-state-tree?

Я не смог найти в mobx-state-tree более подробную документацию для работы с массивами.Кто-нибудь знает кого-нибудь?

Ответы [ 3 ]

3 голосов
/ 18 апреля 2019

Решение состоит в том, чтобы использовать cast :

import { cast } from "mobx-state-tree"

// .....

self.stores = cast(stores)

Это связано с тем, что MST позволяет присваивать моментальные снимки фактическим значениям и автоматически их преобразовывать. Это относится не только к массивам, но и ко всем типам значений. Однако машинопись не имеет поддержки, чтобы назначение было более узким, чем то, для чего оно назначается, что является причиной необходимости приведения. cast ничего не делает, но помогает TS выяснить, что это назначение действительно

1 голос
/ 29 апреля 2019

Вы можете использовать self.stores.replace(stores)

Вот документы для MST, это действительно единственные документы, которые я видел там: https://github.com/mobxjs/mobx-state-tree

Существует также функция setLivelinessCheck('error'), которая очень помогает при локальной отладке, чтобы увидеть возможные ошибки. В списке функций API Overview: https://github.com/mobxjs/mobx-state-tree#api-overview

0 голосов
/ 17 апреля 2019

Массив в MST - это не обычный массив, это сложный тип - IMSTArray<ISimpleType<string>>, поэтому полученная вами ошибка TS TS вполне ожидаема.На мой взгляд, это определенно не является интуитивно оправданным ( и пугающим для новичков ).

То, как вы это решаете, - не хак, но я бы сказал, что единственный простой способ обойтиэто.

...