当我从Wait移动到Promise.all时,TypeScript函数返回类型错误

当我从Wait移动到Promise.all时,TypeScript函数返回类型错误,typescript,es6-promise,Typescript,Es6 Promise,我有一个功能。返回类型是用户的承诺: async function doThing(): Promise<User> { const one = await getOne(); const two = await getTwo(); return { one, two } } 但是在承诺之后抛出错误。所有的都会使错误消失: await Promise.all([onePromise, twoPromise]) .then(([one, t

我有一个功能。返回类型是用户的承诺:

async function doThing(): Promise<User> {
  const one = await getOne();
  const two = await getTwo();
  return {
    one,
    two
  }
}
但是在
承诺之后抛出错误。所有的
都会使错误消失:

  await Promise.all([onePromise, twoPromise])
    .then(([one, two])=>{
      return {
        one,
        two
      }
    });
    throw new Error("oh no!")

正如@jcalz所提到的,您的代码中缺少一个return语句。简单的回答是
中的
return
语句将只为
中定义的函数返回
,而不是为较大的
doThing
函数返回

在这个场景中,这与
wait
Promise.all
Promise有点混淆。然后
都在发挥作用,所以我们可以深入分析它。它帮助我隔离方法链中的每个项,并查看它们实际返回的内容

但首先,让我们回顾一下这些事情的作用:

  • 组合承诺列表(
    Promise允许我们在承诺完成后执行承诺(类似于等待)在本例中,将该承诺转换为另一种类型。这是通过定义一个函数来完成的,该函数接受输入值并返回一个新类型的值。需要注意的是,该函数中的return语句决定了
    的返回值。然后是
    ,而不是调用它的函数

  • wait:wait从承诺中解包一个值。它还会在等待时阻止函数的执行

因此,让我们打破这一链条,添加显式类型来完成:

异步函数doThing():Promise{
//承诺是为任何类型的getOne和getWo返回创建的,假设它是任意的
const-onePromise:Promise=getOne();
constTwoPromise:Promise=getTwo();
//Promise.all将中的承诺列表(承诺[])转换为列表承诺(承诺)
const-allPromises:Promise=Promise.all([one-Promise,two-Promise]);
//.然后将列表的承诺(Promise)转换为用户的承诺(Promise)
//内部的函数接受unwrapped any[],并返回我们希望包装在新承诺中的任何内容(本例中为用户)
//请注意,此处的返回值是确定“.then”的返回值,而不是“doThing”,因为它嵌套在单独的函数中。
//`return`语句受作用域规则的约束,类似于变量作用域
const userPromise:Promise=allPromises.then((值:any[])=>返回{values[0],values[1]});
//wait将承诺用户(Promise)展开为仅一个用户
const user:user=wait userPromise;
//我们现在可以返回,这是原始代码中缺少的行。
返回用户;
}
因此,
等待承诺。所有(…)。然后(…)
链将生成一个
用户
对象…但是如果没有
返回
或变量赋值,函数将不会对其进行任何处理。您的代码只需将
返回
添加到该链的前面

作为说明,在我看来,这可以做得更简单,不需要调用
。然后
,而是等待
承诺。所有

异步函数doThing():Promise{
const-onePromise:Promise=getOne();
constTwoPromise:Promise=getTwo();
//承诺。所有退货承诺和等待退货任何[]
常量值:any[]=等待承诺。all([onePromise,twoopromise]);
//现在我们可以直接从这里回来了
返回{values[0],values[1]};
}

另外,为什么抛出一个新错误会阻止TypeScript错误?TypeScript编译器在检测到一个将执行到底而不返回值的方法时生成了TypeScript错误。通过在函数中抛出一个错误,您可以确保解释器在没有要执行的内容的情况下永远不会到达函数的结尾return…因为它永远不会到达函数的末尾。因此,即使它不起作用,代码也是“正确的”。

您不需要返回承诺吗?
return promise。所有…
?可能这只是一个输入错误或其他什么?我们是否应该这样关闭它?
  await Promise.all([onePromise, twoPromise])
    .then(([one, two])=>{
      return {
        one,
        two
      }
    }).catch(error => {
       return Error(error);
    });
  await Promise.all([onePromise, twoPromise])
    .then(([one, two])=>{
      return {
        one,
        two
      }
    });
    throw new Error("oh no!")