【问题标题】:Mobx-State-Tree - Assign to Array TypeMobx-State-Tree - 分配给数组类型
【发布时间】:2019-09-05 10:37:28
【问题描述】:

我有这个基本模型。

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 & IStateTreeNode>'。 类型 'string[]' 缺少类型 'IMSTArray' 中的以下属性:spliceWithArray、observe、intercept、clear 和 4 more.ts(2322)

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

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

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

【问题讨论】:

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


    【解决方案1】:

    解决方法是使用cast:

    import { cast } from "mobx-state-tree"
    
    // .....
    
    self.stores = cast(stores)
    

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

    【讨论】:

    • 感谢您的回答?
    【解决方案2】:

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

    这里是 MST 的文档,这些确实是我见过的唯一文档:https://github.com/mobxjs/mobx-state-tree

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

    【讨论】:

    • 谢谢。在哪里可以找到 MST 数组上的可用方法?有文档吗?
    • 我最近遇到另一个错误,将新值推送到 volatile 数组不会触发对更新的反应,所以我真的认为一些文档会很有用。
    • 我已经用文档更新了我的答案。对于树中更改后的反应更新,您如何将其与反应组件一起使用?你在使用 Provider 和 mobx-react 包 observer
    【解决方案3】:

    MST 中的数组不是通常的数组,它是 complex type - IMSTArray&lt;ISimpleType&lt;string&gt;&gt;,因此您得到的 TS lint 错误是完全可以预料的。但在我看来,这绝对是不合理的(对新手来说很可怕)。

    你解决它的方法不是破解,但我想说的是唯一简单的方法。

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多