Чтобы корректно обрабатывать ошибки, такие как `ValidationError`, в функции `usersPassportLogin`, необходимо использовать подход, при котором ошибка будет выбрасываться или обрабатываться через `Promise`. Поскольку вы не можете изменить исходную функцию, вы можете обернуть её вызов в `try-catch` блок и возвращать ошибку, если она произошла.
Вот пример, как вы можете это реализовать:
```typescript
export const usersPassportLogin = async (
usersPassportLoginBody: UsersPassportLoginBody,
options?: RequestInit
): Promise<usersPassportLoginResponse | ValidationError> => {
try {
const response = await customFetch<Promise<usersPassportLoginResponse>>(getUsersPassportLoginUrl(), {
...options,
method: 'POST',
headers: { 'Content-Type': 'application/json', ...options?.headers },
body: JSON.stringify(usersPassportLoginBody)
});
// Проверяем статус ответа и предположим, что статус ошибок (< 200 или >= 400)
if (!response || (response.status < 200 || response.status >= 300)) {
throw new ValidationError({
errors: response.errors || {}, // Замените на нужное значение по обработке ошибок
message: 'Validation error occurred'
});
}
return response;
} catch (error) {
if (isValidationError(error)) {
return error; // Возвращаем ValidationError
}
// Обработка других типов ошибок, если это необходимо
throw error; // Или можно обернуть в другой тип ошибки
}
};
// Псевдокод для определения, является ли ошибка ValidationError
function isValidationError(error: any): error is ValidationError {
return error && typeof error.message === 'string' && error.errors !== undefined;
}
// Вызов функции
(async () => {
const result = await usersPassportLogin(usersPassportLoginBody);
if ('errors' in result) {
// Обработка ValidationError
console.error('Validation errors:', result.errors);
} else {
// Обработка успешного результата
console.log('Login successful:', result);
}
})();
```
### Объяснение:
1. **Возврат различных типов**: Функция может возвращать как `usersPassportLoginResponse`, так и `ValidationError`, поэтому мы указываем это в типе возвращаемого значения: `Promise<usersPassportLoginResponse | ValidationError>`.
2. **Проверка статуса ответа**: Внутри блока `try` мы можем проверить статус ответа и выбросить `ValidationError`, если статус указывает на ошибку.
3. **Обработка ошибок с помощью `catch`**: В блоке `catch` мы проверяем, является ли пойманная ошибка `ValidationError`. Если это так, мы возвращаем её. В противном случае можно либо пробросить ошибку дальше, либо обрабатывать её другим способом.
4. **Функция `isValidationError`**: Это типовая защитная функция, которая проверяет, является ли ошибка объектом `ValidationError`.
Таким образом, вы сможете корректно обрабатывать ошибки и различать成功ные результаты и ошибки в вашем коде.