typescript - Redux Saga: Argument av typen 'string' kan inte tilldelas till parametern av typen 'TakeableChannel'


skickar åtgärd med nyttolast, ger detta TypeScript-fel:

Argument of type 'string' is not assignable to parameter of type 'TakeableChannel'.

Exempel :

export default function* watchAuth() {
yield* takeLatest(startAuth.toString(), handleAuthUser); // Argument of type 'string' is not assignable to parameter of type 'TakeableChannel'.
}

använder :

"@reduxjs/toolkit": "^1.8.5",
"typed-redux-saga": "^1.5.0",

Redigera: handleAuthUser generatorfunktion

function* handleAuthUser({ payload: { fields, isRegister } }) {
  const { email, password } = fields || {};
  try {
    if (isRegister) {
      // User registering an account
      yield* call(registerAWS, fields);
      yield* put(promptConfirmation({ email, password }));
    } else {
      // User is logging into his account
      const cognitoUser = yield* call(newCognitoUser, email);

      const authDetails = new AuthenticationDetails({
        Username: email,
        Password: password,
      });

      const res = yield* call(loginAWS, cognitoUser, authDetails);
      if (res.userAttributes) {
        const { email_verified, phone_number_verified, ...userAttributes } = res.userAttributes;
        yield* put(
          promptNewPassword({
            email,
            userAttributes,
            cognitoUser,
          }),
        );
      } else {
        yield* put(checkAuth());
      }
    }
  } catch (error) {
    switch ((error as any).code) {
      // switch cases
    }
  }
}

Reducerare :

startAuth: (
      state,
      action: PayloadAction<{ fields: { [key: string]: string }; isRegister?: boolean }>,
    ) => {
      state.loading = true;
      state.errors = { login: {}, signup: {}, other: {} };
      state.userPendingConfirmation = null;
      state.userPendingNewPassword = null;
      state.resetPasswordUser = null;
    },

Svar #1

För att lösa detta problem behöver du ändra typerna för handleAuthUser. Problemet är att takeLatest förväntar sig att den första parametern av sagan som ska köras (handleAuthUser) är ett objekt med en type-egenskap, men på det sätt du har definierat det nu antar TypeScript att payload är den enda egenskapen i det objektet, vilket inte stämmer överens med förväntningen.

Så att ändra det till:

type AnyAction = {type: string, [key: string]: any}
function* handleAuthUser({ payload: { fields, isRegister } }: AnyAction) {

kommer att fixa det eftersom du berättar för TS att objektet, bland andra åtgärdsparametrar, också har type-egenskapen.

Relaterade artiklar