2017-01-31 52 views
5

我有下列行爲:NGRX /存儲的有效載荷類型混亂

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; 

具有以下基礎減速器安裝

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; 

    }; 
} 

這工作得很好,但是,如果我介紹另一個動作:

export class SelectOHAction implements Action { 
    type = ActionTypes.MODIFY_SELECTED_OH 

    constructor(public payload: string) { } 
} 

請注意,有效載荷對於此動作只有是字符串,因爲一旦這種保存,或試圖編譯,打字稿現在狀態:「過濾器不會對字符串類型exisit | OrderHead []」

現在,如果我進入我的減速,並添加了新的情況:

case orderhead_imp.ActionTypes.MODIFY_SELECTED_OH: { 
return { 
    orderids: state.orderids, 
    entities: state.entities, 
    selectedOhID: action.payload 
}; 
} 

我得到的打字稿錯誤時的映射action.payload:

拋出的TS錯誤「串| OrderHead []是不能分配給輸入字符串」

Ø很明顯,在這兩種情況下,負載都有不同的數據結構,我是否需要通過其他方式更改我的代碼以確保每個案例都爲action.payload選擇正確的類型?

更新

因此,如果我的行爲,我定義的有效載荷爲「任何」,而不是「字符串」它似乎編譯和工作沒有問題,但是這似乎非常哈克(而不是預期行爲)

export class SelectOHAction implements Action { 
    type = ActionTypes.MODIFY_SELECTED_OH 

    constructor(public payload: any) { } 
} 
+0

在您的狀態嘗試'selectedOhID:string | null'到'selectedOhID:string' –

+0

不,我首先嚐試了這一點,但如果我設置鍵入我的reducer任何對於selectedOhID,它仍然失敗,它是一個類型檢查來自動作中定義的有效負載值的錯誤,而不是來自reducer類型定義的錯誤。 – crooksey

+2

你使用什麼版本的打字稿?在打字稿2.1+中出現了一個突破性的變化(可以說是一個錯誤修正),這會影響字符串文字(因此也會受到歧視)。 – rob3c

回答

0

這是Typescript> 2.1和ngrx的util類型的問題。

隨着打字稿2.1及以上,現在你可以簡單地定義爲動作

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

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

現在到處都使用item.ActionTypes.CREATE_OH,與item.CREATE_OH更換。這種類型將按照預期與打字稿流2.1

+0

我與原文有完全相同的問題。我已經對自己的行爲做了這個改變,問題依然存在。 –