Wie verwende ich versprechen.allSettled mit Typoskript?
Typescript Build schlägt Promise.allSetttled
fehl, 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.allSettled
nicht result
oder 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 reason
und result
von 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
Wie Bergi erwähnt, weiß TypeScript nicht, ob der Typ PromiseFulfilledResult
/ ist, PromiseRejectedResult
wenn 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);
}
Definieren Sie den find
Rü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