2017-01-31 12 views
5

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) { } 
} 
+0

W twoim stanie spróbuj 'selectedOhID: string | null' na just 'selectedOhID: string' –

+0

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

+2

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

Odpowiedz

0

jest to problem z maszynopis> 2.1 oraz typ util z ngrx.

Z maszynopisu 2.1 i wyżej teraz po prostu można zdefiniować działania jako

export const CREATE_OH: '[ORDERHEAD] Create Orderhead'; 
export class CreateOHAction implements Action { 
    type = CREATE_OH 

    constructor(public payload: OrderHead[]) { } 
} 

Teraz wszędzie stosowane item.ActionTypes.CREATE_OH, wymień go item.CREATE_OH. Typy będą płynąć zgodnie z oczekiwaniami za pomocą maszynopisu 2.1

+0

Mam dokładnie ten sam problem, co oryginalny post. Już dokonałem tej zmiany w moich działaniach, a problem pozostaje ten sam. –