@IvanLu
Начинающий веб-разработчик

Почему не получается типизировать стейт?

Сейчас делаю приложение в связке реакт + тс, на основную страницу получаю список разных валют по апи которые идут блок за блоком, но хочу, чтоб при нажатии на блок мне открывалась страница с более подробной информацией об этой валюте. Все вышло, но столкнулся с проблемой типизации стейта. С any все работает, но хочется сделать нормально.

const [currency, setCurrency] = React.useState<any>({}); //ожидаю обьект с сервера 

 const fetchCurrency = async function () {
    try {
      const response = await axios.get<any>(url);
      setCurrency(response.data);
    } catch (e) {
      alert(e);
    }
  };

Код выше работает, данные с сервера приходят и можно продолжать но хочется типизировать стейт и запрос как нужно.

Кодпен с типизацией обьекта который я ожидаю с сервера(интерфесы сделаны при помощи конвертера поэтому ошибок быть не должно) :
https://codepen.io/IvaLu/pen/JjZjMgo?editors=0010

Далее я типизирую стейт и запрос но уже вылазит ошибка
const [currency, setCurrency] = React.useState<Pokedex>({}); //ожидаю обьект с сервера 

 const fetchCurrency = async function () {
    try {
      const response = await axios.get<Pokedex>(url);
      setCurrency(response.data);
    } catch (e) {
      alert(e);
    }
  };

Ошибка при типизации стейта:
Argument of type '{}' is not assignable to parameter of type 'Pokedex | (() => Pokedex)'.

Можно исправить и написать так:
const [currency, setCurrency] = React.useState<Pokedex | any>({});
Но это уже костыли и хочется написать нормально.
  • Вопрос задан
  • 123 просмотра
Пригласить эксперта
Ответы на вопрос 1
Если вы ожидаете объект с сервера, значит нужно уметь пожить какое-то время БЕЗ этого объекта? Этот объект вообще может не долететь до вас, что вы тогда будете делать?

Я думаю вам нужно работать не с Pokedex, а с Pokedex | null или чем-то в таком духе. Вам нужен maybe-тип в том или ином виде.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы