MobX状态树:联合中的操作参数类型

时间:2019-08-15 11:35:13

标签: typescript mobx-state-tree

在MST中,当根据定义了具有不同参数类型的相同操作的模型创建联合类型时,我希望能够对联合类型的实例调用操作。不幸的是,参数类型似乎是交集类型而不是联合类型。

在下面的示例中,Item#updatePayload期望string & boolean[][],但应接受I extends SnapshotOrInstance<typeof Foo> ? string | undefined : boolean[][] string | boolean[][] 恕我直言。

我是不是以某种错误的方式使用了?如果是这样,我该如何更改模型才能获得期望的结果?

const Foo = types.model({
  id: types.identifier,
  payload: types.maybe(types.string),
}).actions((self) => ({
  updatePayload(payload?: string) {
    self.payload = payload;
  },
}));

const Bar = types.model({
  id: types.identifier,
  payload: types.array(types.array(types.boolean)),
}).actions((self) => ({
  updatePayload(payload: boolean[][]) {
    applySnapshot(self.payload, payload);
  },
}));

const Item = types.union(Foo, Bar);
const Bucket = types.model({
  items: types.map(Item),
}).actions((self) => ({
  updateItemPayload(id: string, payload?: string | boolean[][]) {
    const item = self.items.get(id);
    item && item.updatePayload(payload);
  },
}));

编辑

实际上,Item#updatePayload的签名应该(我认为)如下

updatePayload<I extends SnapshotOrInstance<typeof Item>>(payload: I extends SnapshotOrInstance<typeof Foo> ? string | undefined : boolean[][])

0 个答案:

没有答案