调用Promise.all时如何保留Typescript返回类型?

时间:2018-10-26 13:35:31

标签: javascript node.js typescript

我有以下代码,其中我有两个函数,它们返回两种不同类型的对象(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响应中得到的对象类型?

谢谢!

2 个答案:

答案 0 :(得分:2)

问题在于promises的类型不能精确地推断为(Promise<InterfaceA> | Promise<InterfaceB>)[]

可以使用元组类型正确键入

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

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

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

答案 1 :(得分:0)

我没有完全理解您的意图,我了解的是您想通过as运算符来实现类似目的。

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