Как типизировать fetch без as?

В TypeScript можно типизировать функцию fetch без использования оператора as, используя generic-параметр в объявлении типа.

В целях типизации функции fetch, мы можем определить вспомогательный тип ResponseData<T>, который будет представлять структуру данных, возвращаемую из API.

type ResponseData<T> = {
  success: boolean;
  data: T;
  error?: string;
};

Затем, мы можем использовать этот тип и указать его в качестве generic-параметра в типе возвращаемого значения у функции fetch.

function getData<T>(url: string): Promise<ResponseData<T>> {
  return fetch(url)
    .then((response: Response) => {
      if (!response.ok) {
        throw new Error(response.statusText);
      }
      return response.json();
    })
    .then((data: T) => {
      return { success: true, data };
    })
    .catch((error: Error) => {
      return { success: false, error: error.message, data: null };
    });
}

В этом примере мы создали функцию getData, принимающую URL в качестве аргумента. Она возвращает Promise, с типизированными данными, представленными в ResponseData<T>.

В теле функции мы используем функцию fetch для выполнения запроса. Затем, мы проверяем статус ответа с помощью response.ok. Если статус не успешный, мы выбрасываем ошибку. Затем мы преобразуем ответ в json и типизируем его как T.

Если все успешно, мы возвращаем объект ResponseData с полем success: true и данными. Если есть ошибки, мы возвращаем объект ResponseData с полем success: false, текстом ошибки и значением null для данных.

Используя этот подход, мы можем типизировать функцию fetch без использования оператора as и предоставить более точные типы для возвращаемых данных из API.