Warum denkt TypeScript, dass meine Eigenschaft void sein könnte, nachdem ich in einem Promise-Catch-Block geworfen habe?
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 nimmt einen String. Die an parseStringMpd übergebenen data schlägt fehl mit:
Argument des Typs 'string | void' kann keinem Parameter des Typs 'string' zugewiesen werden.
Es gibt einige andere Fragen auf SO, die darüber sprechen, wie, wenn das Promise fehlschlägt, der Catch-Block dazu führt, dass die data-Eigenschaft null ist. Aber in meinem Fall wirft der Catch-Block einen Fehler. Die Daten, über die sich beschwert wird, werden also niemals erreicht.
Ist der TypeScript-Parser einfach nicht in der Lage, damit umzugehen?
Antwort #1
Ihr Fehler ist hier:
(error): void => {
throw new FetchError(`Error fetching file ${mpdUrl}: ${error}`);
},
Sie geben an, dass der Rückgabetyp void ist (eine Funktion, die nichts zurückgibt) anstelle von never (eine Funktion, die niemals zurückkehrt). Sie könnten ihn auf : never ändern, aber ich empfehle Ihnen, TypeScript ihn ableiten zu lassen:
error => {
throw new FetchError(`Error fetching file ${mpdUrl}: ${error}`);
},
… Aber wenn Sie async/await verwenden, könnten Sie Ihren Code damit neu schreiben:
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}`)
}
}
Beachten Sie, dass die Variablen response und data korrekt durch Inferenz typisiert sind. Es ist nutzlos, ihre Typen anzugeben.
