различные способы определения initialState для Redux Store - PullRequest
0 голосов
/ 16 апреля 2020

Я недавно сталкивался с этим примером:

state.d.ts

export interface IState {
    token: string | null;
  }

export const tokenReducer = (
  state: IState['token'] = null,
  { type, payload }: AppAction,
): typeof state => {
  switch (type) {
    case 'LOGIN':
      return payload;
    default:
      return state;
  }
};

Это хорошо работает. Тем не менее, я попытался изменить это так:

const initialState: IState = {
  token: null
};

export const tokenReducer = (
  //state: IState['token'] = null,
  state = initialState,
  //state: initialState
  action: AppAction,
): typeof state => {
  switch (type) {
    case 'LOGIN':
      return action.payload;
    default:
      return state;
  }
};

, но я получаю ошибки. Ошибка в action.payload, если я использую state: typeof initialState или state = initialState согласно предложению IDE:

Type 'string' is not assignable to type 'IState'.ts(2322)

Если я попытаюсь state: initialState, тогда очевидно:

'initialState' refers to a value, but is being used as a type here. Did you mean 'typeof initialState'?ts(2749)
``
What am I doing wrong? Am I making a syntax error or is it just not allowed to define initialStates like this?

1 Ответ

2 голосов
/ 16 апреля 2020

Проблема, вероятно, заключается в следующем: вы вообще не возвращаете состояние. Вы просто переопределяете его или возвращаете только токен (не как объект), в зависимости от вашей полезной нагрузки. Я полагаю, что LOGIN -action вернет токен. Таким образом, правильный редуктор будет выглядеть следующим образом:

export const tokenReducer = (
  state: IState['token'] = initialState,
  { type, payload }: AppAction,
): IState => {
  switch (type) {
      case 'LOGIN':
        return {
          ...state,
          token: payload,
        };
      default:
        return state;
    }
};

Или полезная нагрузка содержит {token: string}?

Редактировать: Хорошо, внимательно посмотрев на самый первый tokenReducer Я думаю, что это уменьшает только token, а не объект. Таким образом, правильный initialState будет:

// this equals the `token` in `IState`
const initialState: string | null = null

И да, назначение state = initialState, синтаксически правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...