代码之家  ›  专栏  ›  技术社区  ›  Hussain Ali Akbar

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

  •  1
  • Hussain Ali Akbar  · 技术社区  · 6 年前

    我有下面的代码,其中有两个函数返回两种不同类型的对象(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)
    

    2 回复  |  直到 6 年前
        1
  •  4
  •   Estus Flask    6 年前

    问题是 promises (Promise<InterfaceA> | Promise<InterfaceB>)[]

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

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

    这个问题可以通过消除 承诺 临时变量:

      const res = await Promise.all([returnA(), returnB()]);
    
        2
  •  0
  •   Paulquappe    6 年前

    我不完全理解你的意图,我所理解的是你想用 as 接线员。

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