Почему машинопись думает, что мое свойство может быть недействительным после того, как я добавлю блок обещания? - PullRequest
4 голосов
/ 30 мая 2019
async function fetchMpdData(mpdUrl: string): Promise<MPDFileContainer> {
  const data = await fetch(mpdUrl)
    .then((response): Promise<string> => response.text())
    .catch(
      (error): void => {
        throw new FetchError(`Error fetching file ${mpdUrl}: ${error}`);
      },
    );
  return parseStringMpd(data);
}

parseStringMpd принимает строку.Сбой data, переданный на parseStringMpd:

Аргумент типа 'строка |void 'нельзя назначить параметру типа' string '.

Есть несколько других вопросов о SO, которые говорят о том, что если обещание не выполнится, блок catch вызоветdata свойство недействительно.Но в моем случае блок catch выдает ошибку.Таким образом, данные, на которые жалуются, никогда не будут получены.

Разве анализатор машинописного текста просто не в состоянии справиться с этим?

1 Ответ

5 голосов
/ 30 мая 2019

Ваша ошибка здесь:

  (error): void => {
    throw new FetchError(`Error fetching file ${mpdUrl}: ${error}`);
  },

Вы объявляете, что типом возврата является void (функция, которая ничего не возвращает) вместо never (функция, которая никогда не возвращает). Вы можете изменить его на : never, но я предлагаю вам сделать вывод из TypeScript:

  error => {
    throw new FetchError(`Error fetching file ${mpdUrl}: ${error}`);
  },

… Но если вы используете async / await, вы можете переписать свой код с ними:

async function fetchMpdData(mpdUrl: string): Promise<MPDFileContainer> {
    try {
        const response = await fetch(mpdUrl)
        const data = await response.text()
        return parseStringMpd(data);
    } catch (error) {
        throw new Error(`Error fetching file ${mpdUrl}: ${error}`)
    }
}

Обратите внимание, что переменные response и data правильно введены с помощью логического вывода. Бесполезно объявлять их типы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...