22

我有这个基本模型。

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 错误:

类型 'string[]' 不可分配给类型 'IMSTArray<ISimpleType> & IStateTreeNode<IArrayType<ISimpleType>>'。类型 'string[]' 缺少来自类型 'IMSTArray<ISimpleType>' 的以下属性:spliceWithArray、observe、intercept、clear 和 4 more.ts(2322)

这是一个恼人的错误。我可以通过这样分配来修复它:(self as any).stores = stores但我想停止对我的代码进行黑客攻击。

问题是为什么我会收到这个错误?是否有另一种方法可以分配给 mobx-state-tree 中的数组类型?

我在 mobx-state-tree 中找不到更详细的使用数组的文档。有人知道吗?

4

3 回答 3

35

解决方案是使用cast

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

// .....

self.stores = cast(stores)

这是因为 MST 允许将快照分配给实际值,并自动转换它们。这不仅适用于数组,还适用于所有类型的值。但是,打字稿不支持分配比分配给它的东西更窄的分配,这就是需要强制转换的原因。cast不做任何事情,但它有助于 TS 确定这个分配是有效的

于 2019-04-18T06:45:49.983 回答
4

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

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

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

于 2019-04-29T01:03:33.083 回答
3

MST 中的数组不是通常的数组,它是一个复杂类型- IMSTArray<ISimpleType<string>>,因此您得到的 TS lint 错误是完全可以预料的。不过,在我看来,这绝对是不合理的(并且对新手来说很可怕)。

你解决它的方法不是黑客,但我会说唯一简单的方法。

于 2019-04-17T16:17:28.657 回答