为什么打字稿认为我在放入承诺捕获块后我的财产可能无效?

时间:2019-05-30 16:36:31

标签: typescript promise

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的{​​{1}}失败,

  

'string |类型的参数无效”不能分配给“字符串”类型的参数。

SO上有一个few other questions,它讨论了如果诺言未通过catch块将如何导致parseStringMpd属性无效。但是在我的情况下,catch块引发了错误。因此,将永远无法获得所抱怨的数据。

打字稿解析器是否无法处理?

1 个答案:

答案 0 :(得分:5)

您的错误在这里:

  (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}`)
    }
}

请注意,通过推断正确键入了变量responsedata。声明它们的类型是没有用的。