NGRX-сущность: как назначить action.payload для свойства состояния в UpsertOne

У меня есть редуктор в состоянии сущности. Как мне назначить action.payload.Message в saveMessage.msg во время выступления upsertOne на UPSERT_Message_SUCCESS действие.

 export interface MessageState extends EntityState<Message> {
  // additional entities state properties
    selectedMessageId: number | null;
    loaded: boolean;
    loading: boolean;
  saveMessage?: {
    loaded: boolean;
    loading: boolean;
    msg?: Message;
  };
}

export const adapter: EntityAdapter<Message> = createEntityAdapter<Message>({
  selectId: (msg: Message) => msg.messageId,

});

export const initialState: MessageState = adapter.getInitialState({
  // additional entity state properties
    selectedMessageId: null,
    loaded: false,
    loading: false,
  saveMessage: {
    loaded: false,
    loading: false
  },

});

export function reducer(state = initialState, action: MessageActionsUnion): MessageState {
  switch (action.type) {

    case MessageActionTypes.UPSERT_MessageS_SUCCESS: {
      return adapter.upsertMany(action.payload.Messages, { ...state, loaded: true, loading: false });
    }



    case MessageActionTypes.UPSERT_Message: {
      return { ...state,loading: true, loaded:false };
    }


   //assign action.payload.message to saveMessage.msg

    case MessageActionTypes.UPSERT_Message_SUCCESS: {
   return  adapter.upsertOne(action.payload.saveMessageHeader, {...state,loaded:true,loading:false});

  // return {
  //   ...state,
  //   saveMessage: {
  //     loading: false,
  //     loaded: true,
  //     msgHeader: action.payload.saveMessageHeader
  //   }
 // };
}
    case MessageActionTypes.UPSERT_Message_FAIL: {
      return { ...state };
    }



    default: {
      return state;
    }
  }
}

Соответствующая подпись вызова действия ниже:

export class SaveMessageSuccess implements Action {
  readonly type = MessageActionTypes.SAVE_MESSAGE_SUCCESS;
  constructor(public payload:  {saveMessage:partial <Message> }) {
  }
}

1 ответ

Решение

upsertOne не позволяет Partial<Entity> но ожидает сущность T,

В вашем случае изменение создателя действия на следующее должно помочь:

export class SaveMessageSuccess implements Action {
  readonly type = MessageActionTypes.SAVE_MESSAGE_SUCCESS;
  constructor(public payload:  {saveMessage: Message}) {
  }
}

@ ngrx / entity docs

Другие вопросы по тегам