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