#reactjs #typescript #react-hooks
#reactjs #машинописный текст #реагирующие крючки
Вопрос:
У меня есть проект React typescript, над которым я работаю, и у меня возникли некоторые проблемы с контекстным API.
Я пробовал передавать разные типы в createContext
метод, и все они работают так, как ожидалось. Однако, когда я пытаюсь использовать useReducer
перехват, я получаю следующую ошибку:
Syntax error: Cannot read property 'map' of undefined (0:undefined)
Я передал значение по умолчанию в виде пустых объектов, подобных этому (у меня такое чувство, что именно здесь я получаю ошибку, но этот метод работал для меня ранее):
const AppContext: Context<[AppContextSchema, Dispatch<DispatchReturn>]> = createContext<[AppContextSchema, Dispatch<DispatchReturn>]>([
{} as AppContextSchema,
{} as Dispatch<DispatchReturn>
]);
У меня есть метод для инициализации AppContextSchema
объекта в провайдере:
export const InitializeContext = (): AppContextSchema => {
return {
user: {
...
},
};
}
Вот реализованный мной редуктор, который передается useReducer
крючку:
export type DispatchReturn = {
[key: string]: User | string;
type: string;
}
export const AppContextReducer = (state: AppContextSchema, payload: DispatchReturn): AppContextSchema => {
switch (payload.type) {
case UPDATE_USER:
return {
...state,
user: { ...(payload.user as User) }
};
default:
return state;
}
}
И, наконец, здесь я передаю значение в AppContext.Provider
:
function App() {
return (
<AppContext.Provider value={useReducer(AppContextReducer, InitializeContext())}>
<div className="App">
...
</div>
</AppContext.Provider>
);
}
Я был бы очень признателен за любую помощь, которая может быть предоставлена. Заранее благодарю вас!
Комментарии:
1. Если я установлю тип контекста на
any
, как показано здесь:const AppContext: Context<any> = createContext([{} as AppContextSchema, {} as Dispatch<DispatchReturn>]);
Ответ №1:
Оказывается, это проблема либо с Typescript, @typscript-eslint / eslint-plugin, либо с @typescript-eslint / parser, либо с комбинацией из трех, используемых вместе.
Проблема действительно существовала при определении Context
типа. Context
является универсальным объектом, который ожидает кортеж в качестве аргумента. По какой-либо причине при предоставлении кортежа в качестве аргумента, переданного Context
объекту, он выдавал ошибку, описанную выше. Вот код, который вызывал ошибку:
const AppContext: Context<[AppContextSchema, Dispatch<DispatchReturn>]> = ...
Чтобы устранить эту проблему, я понизил версию своего Typescript до 3.9.7.
Чтобы исправить это, я выполнил следующие команды:
npm uninstall typescript
илиyarn remove typescript
npm install typescript@3.9.7
илиyarn add typescript@3.9.7
rm package.lock
илиrm yarn.lock
rm -rf node_modules
npm install
илиyarn install
Надеюсь, это избавит кого-то от той же головной боли, которую это дало мне.