Тип 'string' не может быть назначен для ошибки типа 'undefined' в InitialState React / Redux

Я получаю ошибку lint Тип "строка" не может быть назначен типу "undefined" в моем initialState при создании хранилища, и я очень борюсь с этим.

Вот упрощенное представление соответствующих частей:

export interface IGeneric {
  aString: string;
  aNumber: number;
}

interface IAppState {
  currentSection: string;
  experiences: IGeneric[] | [];
  finishedScenario: boolean;
  formation: IGeneric[] | [];
  language: LanguageCode;
  languages: IGeneric[] | [];
  projects: IGeneric[] | [];
  skills: IGeneric[] | [];
  texts: IGeneric | Record<string, never>;
  textsDatabase: IGeneric | Record<string, never>;
}

const INITIAL_STATE: IAppState = {
  currentSection: 'main',
  experiences: [],
  finishedScenario: false,
  formation: [],
  language: 'en',
  languages: [],
  projects: [],
  skills: [],
  texts: {},
  textsDatabase: {}
};


let store: Store;

export const getStore = (): Store<IAppState> => {
  if (!store) {
    store = createStore(
      rootReducer,
      INITIAL_STATE, // error here
      compose(applyMiddleware(thunk, updateTexts), devToolsEnhancer())
    );
  }
  return store;
};

изображение ошибки начального состояния

Есть идеи, как я могу это решить? Спасибо!

ОБНОВЛЕНО:

Похоже, что в моих combReducers все мои значения состояний инициализируются undefined по умолчанию, согласно определениям Redux, все редукторы передаются неопределенными при инициализации Итак, хорошо. Я понял эту часть ... но остается вопрос ... как противостоять этому и заставить мой createStore принимать как undefined, так и реальный интерфейс для своего начального состояния ?? ????


person Анна    schedule 28.04.2021    source источник


Ответы (2)


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

Что действительно поразило меня, так это эта проблема Github и это обсуждение SO. Чего мне не хватало, так это:

При использовании combReducers предполагается, что каждый редуктор фрагмента будет владеть своим фрагментом состояния. Это означает предоставление начального значения на случай, если текущий фрагмент не определен, иcommonReducers укажет, если вы этого не сделаете.

а также

Ваши редукторы в настоящее время ничего не делают, кроме возврата того, что было передано. Это означает, что если состояние не определено, они вернут undefined. Итак, combReducers () сообщает вам, что вы нарушаете ожидаемый результат.

Таким образом, стало ясно, что моя проблема возникла с моими conbineReducers, и я переписал его определение типа, чтобы разрешить неопределенные значения.

Вот его окончательная реализация (для упрощения, реальные интерфейсы были изменены для IGeneric):

type IActionReducer<T> = (state: T, action: IAction<T>) => T;

interface RootReducer {
  currentSection: IActionReducer<IGeneric| undefined>;
  experiences: IActionReducer<IGeneric[] | [] | undefined>;
  finishedScenario: IActionReducer<boolean | undefined>;
  formation: IActionReducer<IGeneric[] | [] | undefined>;
  language: IActionReducer<IGeneric| undefined>;
  languages: IActionReducer<IGeneric[] | [] | undefined>;
  projects: IActionReducer<IGeneric[] | [] | undefined>;
  skills: IActionReducer<IGeneric[] | [] | undefined>;
  texts: IActionReducer<IGeneric| Record<string, never> | undefined>;
  textsDatabase: IActionReducer<IGeneric| Record<string, never> | undefined>;
}

const rootReducer = combineReducers({
  currentSection,
  experiences,
  finishedScenario,
  formation,
  language,
  languages,
  projects,
  skills,
  texts,
  textsDatabase
} as RootReducer);

export default rootReducer;

Я очень надеюсь, что это поможет кому-то с подобными проблемами. :)

person Анна    schedule 29.04.2021

Вы не поместили заключительную цитату первой опоры в исходное состояние. Ваше исходное состояние должно:

const INITIAL_STATE: IAppState = {
  currentSection: 'main',
  ....
};
person Asad Ullah    schedule 28.04.2021
comment
О, ты прав. Но это было ошибкой при упрощении компонента, чтобы отобразить его здесь. Реальный currentSection указывает на строковую константу, определенную в другом файле. Во всяком случае, сейчас это исправлено. Спасибо. - person Анна; 28.04.2021
comment
Этот тип сообщения должен быть комментарием, а не ответом. - person Connor Low; 28.04.2021