reactjs - Hur löser jag typerrors "argumentet kan inte tilldelas parametern av typen never" för useReducer-hooken?


Att hovra över variabeln todos i min useReducer-funktion här: const [state, dispatch]=useReducer(reducer, todos); ger följande typfel.

Argument of type 'TodoState[]' is not assignable to parameter of type 'never'.

Jag har försökt att lägga till TodoState[] som returtyp i min reducerfunktion för att försäkra mig om att jag inte av misstag returnerar never[], men felet kvarstår fortfarande:

Följande är den relevanta koden:

interface TodoState {
  id: string;
}

interface TodoAction {
  type?: 'CREATED' | 'DELETED' | 'UPDATED';
  payload?: TodoState;
}

interface TodoReducer {
  state: TodoState[];
  action: TodoAction;
}

interface TodosProviderProps {
  children: ReactChildren;
  todos: TodoState[];
}

const reducer = ({ state = [], action = {} }: TodoReducer): TodoState[] => {
  const { payload, type } = action;

  const mutatedItem = payload;
  if (!mutatedItem) {
    return state;
  }
  const mutatedIndex = state.findIndex((item) => item.id === mutatedItem.id);
  switch (type) {
    case 'CREATED':
      if (mutatedIndex < 0) {
        state.push(mutatedItem);
      }
      break;
    case 'DELETED':
      if (mutatedIndex >= 0) {
        state.splice(mutatedIndex, 1);
      }
      break;
    case 'UPDATED':
      state[mutatedIndex] = mutatedItem;
      break;
    default:
      return state;
  }

  return state;
};

export function TodosProvider({ children, todos }: TodosProviderProps) {
  const [state, dispatch] = useReducer(reducer, todos);// type error for todos here

  // rest of code
}

Svar #1

Efter att ha gått igenom dokumenten upptäckte jag att reducer-funktionen får två parametrar istället för ett objekt som du har destrukturerat.

Så, raden bör vara:

const reducer = (state:TodoState[] = [], action:TodoAction = {}): TodoState[] => {