#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. Не могли бы вы подробнее объяснить этот ответ или предоставить некоторую документацию о вашем выборе? Спасибо