【问题标题】:How to preserve Typescript return types when calling Promise.all?调用 Promise.all 时如何保留 Typescript 返回类型?
【发布时间】:2018-10-26 22:01:21
【问题描述】:

我有以下代码,其中我有两个函数,它们返回两种不同类型的对象(InterfaceA 和 InterfaceB)

现在,当我对它们调用 Promise.all 时,我无法定义 promises 变量的类型,所以我必须使用任何类型。

  interface InterfaceA {
    value: string;
  }

  interface InterfaceB {
    value: number;
  }

  const returnA = (): Promise<InterfaceA> => {
    const obj: InterfaceA = {
      value: 'a'
    };
    return Promise.resolve(obj);
  };

  const returnB = (): Promise<InterfaceB> => {
    const obj: InterfaceB = {
      value: 1
    };
    return Promise.resolve(obj);
  };

  const promises: any = [returnA(), returnB()];
  const res = await Promise.all(promises);

  console.log(res)
  const objA: InterfaceA = res[0];

问题是,一旦我得到 Promise.all 的响应,并尝试定义响应的类型,我得到以下错误:

Type '{}' is not assignable to type 'InterfaceA'.
  Property 'value' is missing in type '{}'. (2322)
Type '{}' is not assignable to type 'InterfaceA'. (2322)

我不确定如何处理这个问题以及我可以做些什么来保留我在 Promise.all 的响应中得到的对象的类型?

谢谢!

【问题讨论】:

    标签: javascript node.js typescript


    【解决方案1】:

    问题在于promises 类型并不能准确推断为(Promise&lt;InterfaceA&gt; | Promise&lt;InterfaceB&gt;)[]

    可以用元组类型正确输入:

      const promises: [Promise<InterfaceA>, Promise<InterfaceB>] = [returnA(), returnB()];
      const res = await Promise.all(promises);
    

    这个问题可以通过消除promises临时变量来避免:

      const res = await Promise.all([returnA(), returnB()]);
    

    【讨论】:

      【解决方案2】:

      我没有完全理解你的意图,我理解的是你想用as 操作符实现这样的目标。

      const returnA = (): Promise<InterfaceA> => {
          const obj: InterfaceA = {
            value: 'a'
          };
          return Promise.resolve(obj as InterfaceA);
        };
      

      【讨论】:

      • 不抱歉,这不是我的本意。很抱歉不清楚。我想要的是,在我调用 Promise.all 并将结果保存在变量(res)中之后,我想将其第 0 个位置值保存在类型为“InterfaceA”的变量(objA)中。现在有意义吗?
      猜你喜欢
      • 2021-02-23
      • 2023-01-12
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      相关资源
      最近更新 更多