AngryBot
@AngryBot
I am in love with Functional Programming.

Как можно корректно написать асинхронный метод у объекта в typescript с дженериком?

На данный момент я пришёл к такому коду, но зная, что в JS можно по-разному, может, есть другие пути. Возможно, более компактные и выразительные?

const ApiServiceModule = {
  get: async <T>(url: string): Promise<T> => await fetch(url)
    .then(response => response.json())
    .catch(err => console.error(err))
}
  • Вопрос задан
  • 181 просмотр
Решения вопроса 1
Aetae
@Aetae Куратор тега JavaScript
Тлен
Что именно ты хочешь сократить, вроде ж дальше некуда: один тип на вход - один на выход?

Ну можешь убрать async и await, они здесь не нужны:
const ApiServiceModule = {
  get: <T>(url: string): Promise<T> => fetch(url)
    .then(response => response.json())
    .catch(err => console.error(err))
}
async/await всего лишь сахар над Promise и в данном случае ничего не делают, т.к fetch и так возвращает Promise.

P.S. Ну и методом я бы это не назвал, это свойство с функцией. Метод имеет доступ к this.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
В дополнение к Aetae - дженерик здесь тоже не нужен
Да, парсинг JSON возвращает any (по историческим причинам) и его вот таким дженериком можно легко кастануть в любой тип. Только зачем вообще использовать TypeScript если мы вечно его затыкаем своей правотой?
Даже если данные приходят с нашего сервера, и мы точно знаем их тип - их нужно проверять, ибо нет гарантии, что никто не ошибся на бэке, что мы не ошиблись в описании типа в который кастуем.
Поэтому должен быть тип unknown, чтоб TypeScript требовал все проверить перед использованием:
const ApiServiceModule = {
  get: (url: string): Promise<unknown> => fetch(url)
    .then(response => response.json())
    .catch(err => console.error(err))
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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