【问题标题】:Returning the correct type from Promise.all in TypeScript从 TypeScript 中的 Promise.all 返回正确的类型
【发布时间】:2021-02-23 22:29:57
【问题描述】:

我在 promise.all() 语句中发出 2 个 API 请求,然后是 .then() 语句来操作数据以适应预期的结果类型。当我使用 async/await 单独启动 API 请求但使用 promise.all 导致返回的数组为 void 类型时,该函数起作用。如何更改响应以推断正确的类型?

这会返回正确的类型

async function getUsers() {
    const users = await axios.get<User[]>("serverURL/users");
    const data = await axios.get<
        Array<{ name: string; data: number }>
    >("serverURL/data");

    const userData = users.data.map(user => {
        return {
            //logic to manipulate userData
        };
    });

    return userData;
}

promise.all 版本返回类型 'void | type 分配给.then()' 获得正确的数据,我可以 console.log 结果以确认它遵循预期的结构。但是编译器拒绝它并出现错误:

Type 'void | UserData[]' is not assignable to type 'UserData[]'.
const getUsers = async () => {
    return Promise
        .all([
            axios.get<User[]>("serverURL/users"),
            axios.get<Array<{ name: string; data: number }>>("serverURL/data")
        ])
        .then <UserData[]>(res => {
            const userData = res[0].map(user => {
                return {
                    //logic to manipulate userData
                };
            });
            return userData;
        })
        .catch(console.error)
}

我尝试过使用promise.all&lt;any&gt;() 和我读过的各种其他技巧,但是关于promise.all 和Typescript 的文档非常少。如果有人能指出我正确的方向或告诉我我做错了什么,我将不胜感激。

【问题讨论】:

  • 在你的第二个getUsers 函数中,我不确定你如何访问users。您需要解构 res 数组才能将用户作为第一个元素访问,但我没有看到。
  • @Brenden 是的,谢谢我在混淆变量时错过了这一点,因为我不能直接发布它。我已更正它,但来自 API 的数据正在被正确访问。这是 Promise.all 返回类型的方式的问题,而不是 map 函数。

标签: javascript typescript es6-promise


【解决方案1】:

问题是问题。当您捕获/处理承诺拒绝时,您不会返回任何内容/无效,从而导致承诺得以履行。 console.error 返回 void,但不重新抛出。因此,您的退货将返回UserData | void。在接球后投掷应该可以解决这个问题。

【讨论】:

  • 谢谢,感谢您抽出宝贵时间查看此内容。
猜你喜欢
  • 2020-08-26
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 2020-04-19
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
相关资源
最近更新 更多