javascript - Promise.all çağırırken Typescript dönüş tiplerini nasıl korurum?


Aşağıdaki kodum var, burada iki farklı türde (InterfaceA ve InterfaceB) nesneler döndüren iki fonksiyonum var

Şimdi, üzerinde Promise.all çağırdığımda, promises değişkeninin türünü tanımlayamıyorum, bu yüzden any ile devam etmem gerekiyor.

  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];

Sorun şu ki, Promise.all yanıtını aldığımda ve yanıtların türlerini tanımlamaya çalıştığımda, aşağıdaki hataları alıyorum:

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

Promise.all'in yanıtında aldığım nesnelerin türünü korumak için bunu nasıl ele alacağım ve ne yapabileceğim konusunda tam olarak emin değilim.

Teşekkürler!

Cevap #1

Sorun şu ki promises türü tam olarak (Promise<InterfaceA> | Promise<InterfaceB>)[] olarak çıkarılamıyor.

Bu, tuple türü ile düzgün bir şekilde yazılabilir:

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

Bu sorun, promises geçici değişkenini ortadan kaldırarak önlenebilir:

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

İlgili makaleler