Я пытаюсь сделать ответ на запрос ax ios типобезопасным, но у меня проблемы с тем, чтобы компилятор TypeScript правильно определил тип. Рассмотрим следующую функцию, которая просто возвращает запрос ax ios, который возвращает необходимые данные в блоке .then и улавливает любую ошибку с помощью блока .catch:
interface ServerResponse {
data: {
User_by_pk: User;
};
}
interface User {
id: string;
password: string;
}
function postRequest() {
return axios
.request<ServerResponse>({
method: 'POST',
url: 'http://example.com',
data: someData
})
.then((res) => {
return res.data.data.User_by_pk; //User type
})
.catch((error: AxiosError<ServerResponse>) => {
console.log(error.message);
return null;
});
}
Я бы предположил, что эта функция получит тип возвращаемого значения Promise<User | null>
(данные, возвращаемые в .then, имеют тип User), но вместо этого он получает тип возврата Promise<any>
. Изменение null на undefined дает тот же результат. Я даже попытался явно указать тип возвращаемого значения функции, но при вызове функции, например, с let user = await postRequest();
, пользователь переменной получает тип User
, а не User | null
, как ожидалось.
Если я удалю .catch block, возвращаемый тип функции правильно распознается как Promise<User>
, но как только я добавляю .catch, он становится Promise<any>
вместо Promise<User | null>
.
Я немного погуглил, и некоторые люди предложили использовать библиотека с типом Maybe или Result, например True Myth , но кажется немного излишним, если эта функциональность уже встроена в TypeScript с Optionals и? оператор (необязательная цепочка). Как я могу заставить TypeScript выдавать правильный тип возвращаемого значения моей функции?