1

在 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[][])
4

0 回答 0