我有这个基本模型。
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中找不到用于处理数组的更详细的文档资料。有人知道吗?
答案 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棉绒错误。不过,在我看来,这绝对不是直觉上合理的(对新来者来说是令人恐惧的)。
解决问题的方法不是黑客,但我想说的是解决它的唯一简单方法。