Была такая функция на javascript, которая перемешивает два vuex модуля:
function mixModules(mainModule, secondModule) {
return {
...mainModule,
state: {
...(mainModule.state || {}),
...(secondModule.state || {}),
},
actions: {
...(mainModule.actions || {}),
...(secondModule.actions || {}),
},
getters: {
...(mainModule.getters || {}),
...(secondModule.getters || {}),
},
mutations: {
...(mainModule.mutations || {}),
...(secondModule.mutations || {}),
},
};
}
Мне понадобилось перевести это в typescript, чтобы редактор понимал и подсказывал верно ключи значения, которая вернёт функция.
Вот такая попытка была написать это на TS, но не вышло, да и код выглядит ужасно.:
import { VuexStoreModule } from '../types';
type MixModules<
FirstModule extends VuexStoreModule,
SecondModule extends VuexStoreModule,
> = {
[k in keyof FirstModule]: k extends keyof SecondModule ?
FirstModule[k] & SecondModule[k] :
k extends keyof FirstModule ?
FirstModule[k] :
k extends keyof SecondModule ?
SecondModule[k] : never
};
function mixModules<
TF extends VuexStoreModule,
TS extends VuexStoreModule,
>(mainModule: TF, secondModule: TS): MixModules<TF, TS> {
return {
...mainModule,
state: {
...(mainModule.state || {}),
...(secondModule.state || {}),
},
actions: {
...(mainModule.actions || {}),
...(secondModule.actions || {}),
},
getters: {
...(mainModule.getters || {}),
...(secondModule.getters || {}),
},
mutations: {
...(mainModule.mutations || {}),
...(secondModule.mutations || {}),
},
};
}
const fState = {
actions: {
a: () => {},
},
};
const sState = {
actions: {
b: () => {},
},
getters: {
get() {},
},
};
const newState = mixModules(fState, sState);
export default mixModules;
Как можно сделать это правильно?