我有下列行爲: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) { }
}
在您的狀態嘗試'selectedOhID:string | null'到'selectedOhID:string' –
不,我首先嚐試了這一點,但如果我設置鍵入我的reducer任何對於selectedOhID,它仍然失敗,它是一個類型檢查來自動作中定義的有效負載值的錯誤,而不是來自reducer類型定義的錯誤。 – crooksey
你使用什麼版本的打字稿?在打字稿2.1+中出現了一個突破性的變化(可以說是一個錯誤修正),這會影響字符串文字(因此也會受到歧視)。 – rob3c