@vlad322111

Можно ли так писать код?

Стоит задача принять массив с данными, на основе которых нужно сделать асинхронные запросы, может возникнуть ошибка, по итогу нужно вернуть результаты успешных запросов. Главный вопрос - правильно ли у меня расставлены типы, как лучше сюда внедрить typescript?

import { Idividend, ImainStock } from "~/types/stocks/mainStock";
import { ItinkoffAPITickers } from "~/types/stocks/tinkoffAPITickers";

export default async function(tickers: Array<ItinkoffAPITickers>): Promise<Array<ImainStock>> {
  console.log("[API fetchHistoricalDiv.js]");

  const currentDate: number = Math.floor(Date.now() / 1000);
  const twoPrevYears: number =
    new Date(new Date().getFullYear() - 2, 0).getTime() / 1000;

  let parsedStocks = await Promise.all(
    tickers.map(async (e: ItinkoffAPITickers): Promise<ImainStock | null> => {
      let ticker: string = '';
      
      if (e.currency === "USD") {
        ticker = e.ticker;
      } else if (e.currency === "RUB") {
        ticker = e.ticker + ".ME";
      } else if (e.currency === "EUR") {
        ticker = e.ticker.replace("@", ".");
      }

      try {
        const responsePriceAndDividendsByTicker = await fetch(
          `https://query1.finance.yahoo.com/v8/finance/chart/${ticker}?period1=${twoPrevYears}&period2=${currentDate}&interval=1mo&includePrePost=true&events=div%7Csplit`
        );
        const dataPriceAndDividendsByTicker = await responsePriceAndDividendsByTicker.json();

        const price =  dataPriceAndDividendsByTicker.chart.result[0].meta.regularMarketPrice;
        const dividends: Array<Idividend> = Object.values(dataPriceAndDividendsByTicker.chart.result[0].events.dividends)

        return {
          text: `[${e.ticker}] - ${e.name}`,
          value: {
            ...e,
            price,
            dividends
          }
        };
      } catch (error) {
        console.log("error", error);
        return null
      }
    })
  )

  const resulStocks = parsedStocks.filter((e): boolean => !!e ) as Array<ImainStock>
  
  return resulStocks;
}
  • Вопрос задан
  • 100 просмотров
Пригласить эксперта
Ответы на вопрос 1
Aetae
@Aetae Куратор тега TypeScript
Тлен
Всякие детали - это дело вкуса, на опасности вам в комментах указали, как и на главную проблему:
const dataPriceAndDividendsByTicker = await responsePriceAndDividendsByTicker.json();

Однако вот тут стоит остановиться по-подробнее.
Даже если вы "типизируете" напрямую возврат от сервера, нет никаких гарантий, что там придёт именно то, что надо. В таком случае вы просто "обанываете" TypeScript. Для всего приходящего с сервера стоит писать хотя-бы минимальный тайпгард.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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