Ошибка типа ответа ошибка в createAsyncThunk из redux-toolkit

#reactjs #typescript #redux-toolkit

#reactjs #машинописный текст #redux-инструментарий

Вопрос:

В чем проблема? Почему ошибка err является ошибкой для typescipt? Существует такая проблема:

ESLint: небезопасный доступ участника.ответ на любое значение.(@typescript-eslint/ нет-небезопасного-доступа для участников)

введите описание изображения здесь

вот основная часть проблемного кода:

  } catch (err) {
         // Here is problem
          if (!err.response) {
            throw err;
          }
          return rejectWithValue(err);
        }
 

Вот полный код:

 export const actionFetchDataUser = createAsyncThunk(
  'data/user',
  async (formVal: TformVal, { rejectWithValue }) => {
    try {
      const GoogleAuth = window.gapi.auth2.getAuthInstance();
      const profileMail = await GoogleAuth.signIn({
        scope: 'profile email',
      });
      const googleEmail = profileMail.getBasicProfile().getEmail();
      if (googleEmail !== formVal.email) {
        throw Error('There is NO email');
      }
      return {
        name: profileMail.getBasicProfile().getName(),
        ava: profileMail.getBasicProfile().getImageUrl(),
      };
    } catch (err) {
     // Here is problem
      if (!err.response) {
        throw err;
      }
      return rejectWithValue(err);
    }
  },
);
 

Ответ №1:

В TypeScript все в catch блоке всегда вводится any до того, как вы выполняете какие-либо утверждения над ним — так как буквально any thing может быть throw n в любой функции, вызываемой из try блока. Вы могли throw 5 бы там, вы могли throw new Error("foo") бы там, вы могли throw new Date() бы там, TypeScript не знает.

Итак, вы обращаетесь any.response туда — и хотя это вполне допустимый TypeScript, вы настроили свой линтер таким образом, чтобы он предупреждал вас об этом. Если вы хотите сделать этот доступ, либо отключите это правило lint (при условии, что вы не получите от него никакого значения где-либо еще), либо выполните утверждение типа, как (err as Something).response здесь .

Однако вся проблема не связана с React или Redux.

Комментарии:

1. thnx Могу ли я каким-либо образом отправить err.response? возвращает отклонениеwithvalue(ошибка ответа);

2. да, но, как я уже сказал, вам нужно будет выполнить утверждение типа через as , защиту типа или что-то подобное, прежде чем вы сможете получить доступ к этому свойству

Ответ №2:

Чтобы решить эту проблему, я последовал совету автора phry

 catch (err) {
      const hasErrResponse = (err as { response: { [key: string]: string } }).response;
      if (!hasErrResponse) {
        throw err;
      }
      return rejectWithValue(hasErrResponse);
    }
 

Комментарии:

1. Не могли бы вы подробнее объяснить этот ответ или предоставить некоторую документацию о вашем выборе? Спасибо