Wie verwende ich versprechen.allSettled mit Typoskript?

Nov 20 2020

Typescript Build schlägt Promise.allSetttledfehl, da es nicht zu mögen scheint, obwohl ich ts config comilerOptions mit gesetzt habe"lib": [ "ES2020.Promise" ],

Es scheint, als ob die Antwort für promise.allSettlednicht resultoder enthält reason.

Beim Ausführen von Typoskript-Build wird folgende Fehlermeldung angezeigt:

Property 'reason' does not exist on type 'PromiseSettledResult<IMyPromiseResult>'.

und

Property 'value' does not exist on type 'PromiseRejectedResult'.

Mein Code - Block wie folgt aussieht und wie man sehen kann, ich versuche den Zugriff auf reasonund resultvon eaech der Versprechungen , die gelöst bekommen.

const myPromise = async () : Promise<IMyPromiseResult> {
  return new Promise((resolve) => {
    resolve("hello world")
  })
}

const data = await Promise.allSettled([
  myPromise()
]);

const response = data.find(res => res.status === 'fulfilled')?.result;

if(!response) {
  const error = data.find(res => res.status === 'rejected')?.reason;
  throw new Error(error);
}

Wie kann ich die Promise.allSettled-Deklaration aktualisieren, um die richtigen Schnittstellen einzuschließen?

Antworten

2 Jens Nov 20 2020 at 11:46

Wie Bergi erwähnt, weiß TypeScript nicht, ob der Typ PromiseFulfilledResult/ ist, PromiseRejectedResultwenn Typen überprüft werden.

Der einzige Weg ist, das Versprechen Ergebnis zu geben. Dies ist möglich, weil Sie bereits überprüft haben, ob das aufgelöste Versprechen erfüllt oder abgelehnt wurde.

Siehe dieses Beispiel:

const myPromise = async (): Promise<string> => {
  return new Promise((resolve) => {
    resolve("hello world");
  });
};

const data = await Promise.allSettled([myPromise()]);

const response = (data.find(
  (res) => res.status === "fulfilled"
) as PromiseFulfilledResult<string> | undefined)?.value;

if (!response) {
  const error = (data.find(
    (res) => res.status === "rejected"
  ) as PromiseRejectedResult | undefined)?.reason;
  throw new Error(error);
}
2 bela53 Nov 20 2020 at 13:13

Definieren Sie den findRückruf als Typschutz, der ein Typprädikat zurückgibt:

type IMyPromiseResult = string

const response = data.find(
  (res): res is PromiseFulfilledResult<string> => res.status === 'fulfilled'
)?.value;

if (!response) {
  const error = data.find(
    (res): res is PromiseRejectedResult => res.status === 'rejected'
  )?.reason;
  throw new Error(error);
}

Demo-Spielplatz