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