Я пытаюсь абстрагироваться от логики useContext и useReducer, чтобы не повторять код всякий раз, когда я создаю новый контекст, но я столкнулся с некоторыми проблемами, когда я пытался сильно ввести createContext с помощью typescript.
С помощью этой функции я автоматизирую создание контекста:
import React, { createContext, ReactElement, useReducer } from 'react';
type ProviderProps = {
children: ReactElement;
};
type ActionType = {
type: string;
payload?: any;
};
export default function <StateType>(
reducer: (state: StateType, action: ActionType) => StateType,
actions: any,
initialState: StateType,
) {
type ContextType = {
state: StateType;
actions:{
[k: string]: Function;
}
};
const Context = React.createContext<ContextType | undefined>(undefined);
const Provider = ({ children }: ProviderProps) => {
const [state, dispatch] = useReducer(reducer, initialState);
const boundActions: any = {};
for (let key in actions) {
boundActions[key] = actions[key](dispatch);
}
return (
<Context.Provider value={{ state, actions:{
...boundActions
} }}>
{children}
</Context.Provider>
);
};
return { Context, Provider };
}
Пример создания контекста:
import createDataContext from './createDataContext';
import { INCRASE_COUNT, DECRASE_COUNT } from './ActionTypes';
type ActionType = {
type: string;
payload?: any;
};
type StateType = {
count: number;
};
const reducer = (state: StateType, action: ActionType) => {
switch (action.type) {
case INCRASE_COUNT:
return { count: state.count + 1 };
case DECRASE_COUNT:
return { count: state.count - 1 };
default:
return state;
}
};
const incrementCount = (dispatch: React.Dispatch<any>) => {
return () => {
dispatch({ type: INCRASE_COUNT });
};
};
const decrementCount = (dispatch: React.Dispatch<any>) => {
return () => {
dispatch({ type: DECRASE_COUNT });
};
};
export const { Context, Provider } = createDataContext<StateType>(
reducer,
{
incrementCount,
decrementCount,
},
{ count: 69 },
);
Когда я его использую:
import { Context as ExampleContext } from '../context/ExampleContext';
const { state, actions } = useContext(
ExampleContext,
);
он подчеркивает состояние и действия красной линией и говорит: Свойство «состояние, действия» не существует для типа «ContextType | неопределенный'
Что я сделал не так, есть что-то, что я пропустил?
PLZZZZZZ ПОМОГИТЕ МНЕ.