Mobx-State-Tree-分配给数组类型

时间:2019-04-15 12:33:31

标签: typescript mobx tslint mobx-react mobx-state-tree

我有这个基本模型。

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 个答案:

答案 0 :(得分:3)

解决方案是使用cast

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

// .....

self.stores = cast(stores)

这是因为MST可以将快照分配给实际值,并自动将其转换。这不仅适用于数组,还适用于所有类型的值。但是,打字稿不支持将分配范围缩小到比分配给对象更窄的范围,这就是需要强制转换的原因。 cast不会执行任何操作,但可以帮助TS找出此分配是有效的

答案 1 :(得分:1)

您可以使用self.stores.replace(stores)

以下是MST的文档,这些实际上是我在那里看到的唯一文档:https://github.com/mobxjs/mobx-state-tree

还有一个功能setLivelinessCheck('error'),该功能可以在本地进行调试以查看可能发生的错误,对您有很大帮助。它在API概述功能列表中:https://github.com/mobxjs/mobx-state-tree#api-overview

答案 2 :(得分:0)

MST中的数组不是通常的数组,它是complex type-IMSTArray<ISimpleType<string>>,因此完全可以预料到TS棉绒错误。不过,在我看来,这绝对不是直觉上合理的(对新来者来说是令人恐惧的)。

解决问题的方法不是黑客,但我想说的是解决它的唯一简单方法。