Website-Suche

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.

Verwandte Artikel