在 TypeScript 中从 Promise.all 返回正确的类型

Returning the correct type from Promise.all in TypeScript

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

这个returns正确的类型

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 version returns type 'void | type assigned to.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<any>() 和我读过的其他各种技巧,但是关于 promise.all 和 Typescript 的文档非常少。如果有人能指出我正确的方向或告诉我我做错了什么,我将不胜感激。

问题是问题所在。当您 catch/handle 承诺被拒绝时,您正在 returning nothing/void 导致承诺得以实现。 console.error return无效,但不会重新抛出。因此,您的 return 将 return 变成 UserData | void。在接球后投掷应该可以解决这个问题。