вернуть полный класс с оператором редуктора

Я получаю сообщение об ошибке:

"Тип '{разрешения: любые; avatarUrl: строка; электронная почта: строка; calendarStatus: строка; roleID: number; lastLoginDate: DateType; mfa: boolean; availability: string | null; outOfOffice: any[]; ... еще 4. ..; name: string;}'отсутствуют следующие свойства типа'User': role, subtitle, searchField, link и 3 more.ts(2740)"

со следующей функцией:

      const reducer = (state: User, action: { type: string, value: any | object }): User => {
  switch (action.type) {
    case 'roleChange':
      return { ...state, ...action.value }
    case 'permissionsChange':
      return { ...state, permissions: { ...state.permissions, ...action.value } }
    default:
      break
  }
  return state
}

Проблема в этой строке:

      return { ...state, permissions: { ...state.permissions, ...action.value } }

Мое намерение - вернуть полный класс, а не его частичный. Я знаю, что могу ввести его, чтобы вернуть частичного пользователя, но это исправление делает другие части моего кода неработоспособными, поскольку я ссылаюсь на определенные атрибуты в классе User.

1 ответ

Вы распространяете action.valueвместо присвоения значения свойству. Должно выглядеть так.

      const reducer = (state: User, action: { type: string, value: any | object }): User => {
  switch (action.type) {
    case 'roleChange':
      return { ...state, ...action.value }
    case 'permissionsChange':
      return { ...state, permissions: action.value }
    default:
      break
  }
  return state
}

Или, если вы знаете поле внутри разрешений, которые вы хотите обновить

      const reducer = (state: User, action: { type: string, value: any | object }): User => {
  switch (action.type) {
    case 'roleChange':
      return { ...state, ...action.value }
    case 'permissionsChange':
      return { ...state, permissions: { ...state.permissions, someField: action.value } }
    default:
      break
  }
  return state
}
Другие вопросы по тегам