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
, не работает:
Argument of type 'string | void' is not assignable to parameter of type 'string'.
В SO есть несколько других вопросов, в которых говорится о том, что, если обещание не выполняется, блок catch приведет к тому, что свойство data
станет недействительным. Но в моем случае блок catch выдает ошибку. Таким образом, данные, на которые жалуются, никогда не будут доступны.
Парсер машинописного текста просто не может справиться с этим?
Ваша ошибка здесь:
(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
правильно типизированы логическим выводом. Бесполезно объявлять их типы.