Аргумент типа «X» нельзя назначить параметру типа «Y» с помощью NGRX - PullRequest
1 голос
/ 23 апреля 2020

Я создаю ограничитель персонала ...

Тем не менее, мы знаем, что запросы вполне могут быть неудачными, и поэтому я вставил в getInitialState() некоторые свойства, такие как data, error и loading.

data - это object типа People, позволяющий вводить значения указанного c персона.

error - это object типа RequestError, если в запросе возникает ошибка.

Наконец, loading - загрузка запросов.

возникает ошибка, которая говорит о том, что интерфейс RequestError не подписан в интерфейсе People, что очевидно, потому что я использую состояние в качестве базы.

enter image description here

Как мне реализовать эту реализацию?

ОШИБКА:

var error: RequestError
Argument of type 'RequestError' is not assignable to parameter of type 'People'.
  Type 'RequestError' is missing the following properties from type 'People': id, isMain, avatar, messagests(2345)

ДЕЙСТВИЯ:

import { createAction, props } from '@ngrx/store';
import { RequestError } from '@shared/interfaces/request.interface';
import { People } from '@shared/interfaces/people.interface';

export const GET = createAction('[GET: USER/API] Get a people');

export const CREATE = createAction('[POST: USER/API] Create a new people', props<{ data: People }>());
export const CREATE_SUCCESS = createAction('[POST: USER/API] Successfully created person', props<{ data: People }>());
export const CREATE_FAIL = createAction('[POST: USER/API] Failed to create a new person', props<{ error: RequestError }>());

export const UPDATE = createAction('[PUT: USER/API] Update a people', props<{ id: string; changes: Partial<People> }>());
export const UPDATE_SUCCESS = createAction('[PUT: USER/API] Person updated with success', props<{ id: string; changes: Partial<People> }>());
export const UPDATE_FAIL = createAction('[PUT: USER/API] Person update failed', props<{ error: RequestError }>());

РЕДУКТОР:

import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity';
import { Action, createReducer, on } from '@ngrx/store';
import { People } from '@shared/interfaces/people.interface';
import * as fromPeopleAction from './people.actions';

export interface State extends EntityState<People> {}

export const adapter: EntityAdapter<People> = createEntityAdapter<People>({
    selectId: (people: People) => people.id,
});

const INIT_STATE: State = adapter.getInitialState({
    data: null,
    error: null,
    loading: false,
});

const peopleReducer = createReducer(
    INIT_STATE,
    on(fromPeopleAction.CREATE, (state: State, { data }) => adapter.addOne(data, { ...state, loading: true })),
    on(fromPeopleAction.CREATE_SUCCESS, (state: State, { data }) => adapter.addOne(data, { ...state, loading: false })),
    on(fromPeopleAction.CREATE_FAIL, (state: State, { error }) => adapter.addOne(error, { ...state, loading: false }))
);

export function reducer(state: State | undefined, action: Action) {
    return peopleReducer(state, action);
}

1 Ответ

0 голосов
/ 23 апреля 2020

Как показывает ваша диаграмма, свойство data из State остается нулевым, даже если ваше действие CREATE выполнено успешно, что означает, что проблема связана с подпорками вашего действия. Поскольку ваш EntityAdapter имеет тип People, при вызове функции adapter.addOne() он ожидает параметры типа People. То, как вы моделировали свое состояние, data, error и loading являются свойствами People, что означает, что, когда вы хотите добавить или обновить любое свойство, вам нужно обернуть его внутри класса People.

Таким образом, вам придется изменить реквизиты действия CREATE_FAIL на что-то похожее на:

props<{ people: { error: RequestError } }>()

Или, когда вы звоните adapter.addOne(), оберните его.

На случай, если вы Если в хранилище уже создано состояние пользователей и вы хотите добавить ошибку, вы можете позвонить adapter.updateOne() вместо addOne().

...