typescript - Egenskapen 'reason' finns inte på typen 'PromiseSettledResult'. Även om jag har filtrerat de avslutade resultaten så att endast avslag återstår


Jag vill extrahera alla avvisade löften. Men även om jag filtrerar bort de löften som har avvisats, visar min TypeScript-tolk fortfarande att löftena fortfarande kan uppfyllas. Det inträffar i koden nedan

const promises = .... // generate a bunch of promises
const results = await Promise.allSettled(promises)

const errors = results.filter(result => result.status === 'rejected')

// Errors out here -> 'Property 'reason' does not exist on type 'PromiseSettledResult<never>''
const reasons = errors.map(error => error.reason)

Varför visar det detta Property 'reason' does not exist on type 'PromiseSettledResult<never>'. fel även om jag har filtrerat listan för att säkerställa att den endast innehåller avvisade promises? Hur kan jag fixa detta?

Svar #1

Problem

Typen för Array.filter ser ut så här:

filter<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S[];

- TypeScript/lib/lib.es5.d.ts#L1367

Du kommer att kunna se att returtypen är S vilket är en utökning av T där T är typen av value. I din situation är value results som har typen PromiseSettledResult<void>[], därav felet du har.

Lösning

TypeScript kan inte på egen hand förstå att result.status === 'rejected' filtrerar arrayen så att den endast innehåller avvisade löften. Du kan använda en typ-predikat för att hjälpa TypeScript att avgränsa din typ:

const errors = results.filter(
  (result): result is PromiseRejectedResult =>
    result.status === 'rejected'
)

TypeScript-lekplats

Relaterade artiklar