reactjs - Typescript React UseReducer Type-fejl på Provider-værdi
Jeg støder i øjeblikket på fejl, når jeg prøver at få min provider til at fungere ved hjælp af React Context API i Typescript, jeg får følgende fejl,
Type '{ state: { hasEnterPressed: boolean; searchQuery: string; }; dispatch: Dispatch<stringAction>; }'
is missing the following properties from type '{ hasEnterPressed: boolean; searchQuery: string; dispatch:
(state: { hasEnterPressed: boolean; searchQuery: string; }, action: stringAction) =>
{ hasEnterPressed: boolean; searchQuery: string; }; }': hasEnterPressed, searchQuery TS2739
50 |
51 | return (
> 52 | <SearchContext.Provider value={value}>
| ^
53 | {props.children}
54 | </SearchContext.Provider>
55 | )
Jeg tror, det er relateret til konstruktionen af mit CreateContext-kald, hvilket er grunden til, at jeg muligvis støder på problemer. Jeg har prøvet at bygge interfacetypen, men jeg får stadig den samme fejl.
import React, {useReducer, createContext, Dispatch} from "react";
export interface Action {
type: string
}
export interface stringAction extends Action {
payload: string
}
export interface reducerState {
hasEnterPressed: boolean
searchQuery: string,
}
const reducer = (state: reducerState, action: stringAction) => {
switch(action.type) {
case "UPDATEKEYPRESS":
return {
...state,
hasEnterPressed: false
};
case "UPDATESEARCHQUERY":
return {
...state,
searchQuery: action.payload
}
default:
throw new Error();
}
}
const initalState: reducerState = {
hasEnterPressed: false,
searchQuery : '',
}
export const SearchContext = createContext<reducerState>(initalState);
export const SearchProvider: React.FC = (props) => {
const [state, dispatch] = useReducer(reducer, initalState)
const value = {state, dispatch}
return (
<SearchContext.Provider value={value}>
{props.children}
</SearchContext.Provider>
)
}
export default SearchProvider;
Svar #1
value, som du sender ind, er et objekt {state, dispatch}, mens createContext<reducerState> gør provider forventende, at det skal være reducerState.
Du skal enten ændre typen af kontekst til
interface SearchContextValue {
state: reducerState;
dispatch: Dispatch<ReducerAction<typeof reducer>>
}
export const SearchContext = createContext<SearchContextValue>({
state: initalState,
dispatch: () => {} // fake, but it is not possible to provide at this point
});
eller hvis du ikke har brug for at sende en dispatch - send tilstanden som værdien
<SearchContext.Provider value={state}>
Bemærk venligst, at det er god praksis at skrive typers navne med stort, ellers bliver det svært at skelne dem fra variablers navne.
