J'ai une application qui comporte plusieurs magasins avec la même fonctionnalité de réducteur. J'ai essayé de créer un réducteur générique et cela a bien fonctionné.
paramètres du réducteur générique :
interface State {
itemList : T[]
}
const initialState: State = {
itemList: []
}
const createReducer = (type: string) => {
return (state = initialState, action: any): State => {
switch (action.type) {
case types.get(type).Add:
return {
...state,
itemList: [...state.itemList, action.payload]
}
case types.get(type).AddList:
return {
...state,
itemList: [...state.itemList, ...action.payload]
};
default:
return state;
}
}
}
Ensuite, je combinerais les réducteurs comme suit :
export const reducers: ActionReducerMap = {
vehiculeState: createReducer('vehicule'),
rentState: createReducer('rent'),
clientState : createReducer('client'),
companionState : createReducer('companion'),
paymentState : createReducer('payment'),
notificationState : createReducer('notification'),
employeeState : createReducer('employee')
}
Le problème est que en passant en mode générique, je devrais réécrire une grande partie de mon application, car j'ai déjà créé plusieurs réducteurs avec des états contenant des propriétés nommées (clientList
, vehiculeList
, ...), et le nom de la propriété itemList
n'est pas très informatif. Ma question est donc : comment passer en mode générique tout en conservant les propriétés de l'état telles quelles?
Un exemple de réducteurs actuels :
export function rentReducer(state = initialState, action: rentActions.RentActions): State {
switch(action.type){
case rentActions.ADD_RENT:
return{
...state,
rentList : [...state.rentList, action.payload]
}
case rentActions.ADD_RENT_LIST:
return {
...state,
rentList : [...state.rentList, ...action.payload]
};
default:
return state;
}
}