Typescript ger ett fel när man kallar Promise.all med en array av löften


Jag har ett problem med Promises i Typescript. Jag försöker anropa Promise.all med en array av löften men istället får jag

Ingen överbelastning matchar detta anrop. Den sista överbelastningen gav följande fel. Argument av typen '(Promise | Promise)[]' kan inte tilldelas parametern av typen 'Iterable'. [...]

Nedan ett förenklat exempel på det jag refererar till:

const promise1 = Promise.resolve(true);         //promise1:Promise<boolean>
const promise2 = Promise.resolve('promise...'); //promise2:Promise<string>
const promises = [promise1, promise2];

Promise.all(promises); //Error here

Men koden nedan fungerar som jag skulle anta.

const promise1 = Promise.resolve(true);
const promise2 = Promise.resolve('promise...');

Promise.all([promise1, promise2]);

Verkar som ett fel för mig, men jag är inte säker. Jag har tittat igenom GitHub och letat efter detta problem, men jag hittade inget som matchade. Eller gör jag något fel och det finns en lösning så att man kan övervinna problemet. Självklart kan jag inte bara skriva Promise.all([promise1, promise2]) i min huvudsakliga kod eftersom matrisen av löften är dynamisk.

Jag använder TypeScript @3.9.6.

Svar #1

Problemet har inget att göra med Promises i sig, utan snarare med hur TypeScript härleder typen av en tuple.

Du kan läsa mer om den faktiska frågan i detta svar, men kärnan i det är följande

const a = [1, "a", true] //<- (string | number | boolean)[], not [number, string, boolean]

Problemet bör lösas med introduktionen av variadiska typer i TS 4.0. För tillfället finns det två sätt att göra det du vill.

Den första är const-assertioner

const b = [1, "a", true] as const // <- [number, string, boolean]

Och den andra är att använda en hjälpfunktion som den som publicerades i svaret jag länkade ovan.


I ditt specifika fall fungerar inte sättet Promise.all är typat på bra med hur TS härleder typen av promises. Detta åtgärdas enkelt genom att ha en korrekt tuppel med en av de metoder som beskrivs ovan.

Lekplatslänk

Relaterade artiklar