Редуктор, адаптер сущности: для типа не существует свойства «учетные записи» - Angular 7, Rxjs 6, Ngrx - PullRequest
0 голосов
/ 27 апреля 2019

Я получаю ошибку:

ERROR in src/app/account/account.reducers.ts(24,37): error TS2339: Property 'accounts' does not exist on type '{ account: Account; } | { accounts: Account[]; }'.
  Property 'accounts' does not exist on type '{ account: Account; }'.

Это относится к строке addAll на адаптере в редукторе:

export interface AccountState extends EntityState<Account> {
  allAccountsLoaded : boolean;
}

export const adapter : EntityAdapter<Account> = createEntityAdapter<Account>();

export const initialAccountState: AccountState = adapter.getInitialState({
  allAccountsLoaded: false
});

export function accountReducer(state = initialAccountState, action: AccountActions): AccountState {
  switch(action.type) {
    case AccountActionTypes.AccountLoaded:
      adapter.addOne(action.payload.account, state);

    case AccountActionTypes.AllAccountsLoaded:
      adapter.addAll(action.payload.accounts, {...state, allAccountsLoaded: true});
    default: {
      return state;
    }
  }
}

, но когда я смотрю на соответствующие действия редукторапередаваемая им полезная нагрузка представляет собой массив учетных записей с именем реквизита как «account»

export class AllAccountsLoaded implements Action {
  readonly type = AccountActionTypes.AllAccountsLoaded;

  constructor(public payload: {accounts: Account[]}) {
  }
}

Так что, похоже, полезная нагрузка должна быть передана правильно.меня беспокоит часть ошибки: '{account: Account;} |{account: Account [];}».Я уже видел, как Ngrx выдает такие ошибки, если я неправильно набрал название одного из событий в наблюдаемых эффектах, но я проверил его, и он выглядит хорошо с первого взгляда:

  @Effect()
  loadAllAccounts$ = this.actions$
  .pipe(
    ofType<AllAccountsRequested>(AccountActionTypes.AllAccountsRequested),
    withLatestFrom(this.store.pipe(select(allAccountsLoaded))),
    filter(([action, allAccountsLoaded]) => !allAccountsLoaded),
    mergeMap(() => this.accountService.getUserAccounts()),
    map(accounts => new AllAccountsLoaded({accounts}))
  );

1 Ответ

0 голосов
/ 27 апреля 2019

Хорошо. Если кто-то еще может столкнуться с этим. Сообщение об ошибке очень вводит в заблуждение. Если вы посмотрите на определение редуктора:

export function accountReducer(state = initialAccountState, action: AccountActions): AccountState {
  switch(action.type) {
    case AccountActionTypes.AccountLoaded:
      adapter.addOne(action.payload.account, state);

    case AccountActionTypes.AllAccountsLoaded:
      adapter.addAll(action.payload.accounts, {...state, allAccountsLoaded: true});
    default: {
      return state;
    }
  }
}

Вы заметите, что рядом с функциями стиля хранилища адаптеров у вас отсутствует предложение return, поэтому оно должно быть:

return adapter.addAll(action.payload.accounts, {...state, allAccountsLoaded: true});

Это просто опечатка, но вам может потребоваться некоторое время, чтобы отследить ее из-за ошибки, указывающей в совершенно ином направлении.

...