Mam następujące czynności:NGRX/Store Typ ładowność zamieszanie
export const ActionTypes = {
CREATE_OH: type('[ORDERHEAD] Create Orderhead'),
MODIFY_SELECTED_OH: type('[ORDERHEAD] Select Orderhead'),
};
export class CreateOHAction implements Action {
type = ActionTypes.CREATE_OH
constructor(public payload: OrderHead[]) { }
}
export type Actions
= CreateOHAction
| SelectOHAction;
z następującymi podstawowej konfiguracji reduktora
export interface State {
orderids: string[];
entities: { [orderID: string]: OrderHead };
selectedOhID: string | null;
};
// Set initial state to empty
const initialState: State = {
orderids : [],
entities: {},
selectedOhID: null,
};
export function OHreducer(state = initialState, action: orderhead_imp.Actions): State{
switch(action.type){
case orderhead_imp.ActionTypes.CREATE_OH:
let orders = action.payload;
let newOrders = orders.filter(orderhead => !state.entities[orderhead.orderID]);
let newOrderIds = newOrders.map(orderhead => orderhead.orderID);
let newOrderHeadEntities = newOrders.reduce((entities: { [orderID: string]: OrderHead }, orderhead: OrderHead) => {
return Object.assign(entities, {
[orderhead.orderID]: orderhead
});
}, {});
return {
orderids: [ ...state.orderids, ...newOrderIds ],
entities: Object.assign({}, state.entities, newOrderHeadEntities),
selectedOhID: state.selectedOhID
};
default:
return state;
};
}
to działa prawidłowo, jednak, jeśli mogę przedstawić kolejną akcję:
export class SelectOHAction implements Action {
type = ActionTypes.MODIFY_SELECTED_OH
constructor(public payload: string) { }
}
Uwaga, ładunek dla tego działania tylko jest ciągiem, jak szybko, jak to zapisane, lub starał się skompilować, maszynopis teraz stwierdza: „filtr nie exisit na typu string | OrderHead []”
Teraz jeśli pójdę do mojego reduktora i dodać nowy przypadek:
case orderhead_imp.ActionTypes.MODIFY_SELECTED_OH: {
return {
orderids: state.orderids,
entities: state.entities,
selectedOhID: action.payload
};
}
dostaję błędy maszynopisu gdy mapowanie action.payload od:
Zgłasza błąd TS "string | OrderHead [] nie jest przypisane do typu string"
o oczywiście w obu przypadkach ładunek ma inną strukturę danych, czy muszę zmienić kod w inny sposób, aby upewnić się, że każdy przypadek zbiera poprawny typ dla action.payload?
Aktualizacja
Więc jeśli w moich działaniach zdefiniować ładunek jako „any” zamiast „łańcuch” wydaje się skompilować i działać bez problemu, jednak to wydaje bardzo hacky (a nie oczekiwać zachowanie)
export class SelectOHAction implements Action {
type = ActionTypes.MODIFY_SELECTED_OH
constructor(public payload: any) { }
}
W twoim stanie spróbuj 'selectedOhID: string | null' na just 'selectedOhID: string' –
Nie, próbowałem tego przede wszystkim, ale jeśli ustawię typ w moim reduktorze dowolnego dla selectedOhID nadal się nie udaje, jest to błąd sprawdzania typu od wartości ładunku zdefiniowanej w akcjach, a nie błąd z definicji typu reduktora. – crooksey
Jaką wersję maszynopisu używasz? Nastąpiła przełomowa zmiana (prawdopodobnie poprawka błędu) w maszynopisie 2.1+, która wpływa na literały ciągów (a zatem dyskryminowane związki). – rob3c