У меня есть следующий код;
import React, { useContext, useReducer, useEffect, } from 'react';
const AppContext = React.createContext({});
const App = () => {
let initialState = { lang: 'en', color: 'blue'};
let reducer = (state, action) => {
if (action === null ) {
localStorage.removeItem("action");
return initialState;
}
switch (action.type) {
case "change-language":
return { ...state, lang: action.payload };
default: return {initialState}
}
};
const localState = JSON.parse(localStorage.getItem("state")!);
let [state, dispatch] = useReducer(reducer, localState || initialState );
let value = { state, dispatch };
return (
<AppContext.Provider value={value}>
<LanguagePicker />
<Menu />
</AppContext.Provider>
);
}
const Menu = () => <MenuItem />;
const LanguagePicker = () => {
const {state, dispatch} = useContext(AppContext);
let setLanguage = lang => () => dispatch({ type: "change-language", payload: lang });
useEffect(() => {
localStorage.setItem("state", JSON.stringify(state));
}, [state]);
return (
<div>
<button onClick={setLanguage('en')}>English</button>
<button onClick={setLanguage('fr')}>French</button>
</div>
);
}
const MenuItem = () => {
const { state, dispatch } = useContext(AppContext);
return (
<div>
<p>Locale: {state.lang}</p>
</div>
);
}
export default App;
Теперь этот код прекрасно работает в JS / JSX, но в машинописном тексте выдает следующую ошибку:
Property 'state' does not exist on type '{}'.ts(2339)
Property 'dispatch' does not exist on type '{}'.ts(2339)
@
const LanguagePicker = () => {
const {state, dispatch} = useContext(AppContext);
Вопросочевидно становится;как сделать так, чтобы свойство существовало для типа {}?(Или обмануть компилятор, заставив его думать, что он существует. Почему он вообще выдает это предупреждение / ошибку компилятора?
Я не понимаю.
Я пытался определитьсостояние в интерфейсе, затем приложение: React.Component <'any, Interface'>, (как я видел сообщение, где это работает для компонентов класса, но безрезультатно.)
Кто-то указал мне направильное направление будет высоко ценится.