Typescript kaster en fejl, når der kaldes Promise.all med et array af promises
Jeg har et problem med Promises i Typescript. Jeg prøver at kalde Promise.all med et array af promises, men i stedet får jeg
Ingen overbelastning passer til dette kald. Den sidste overbelastning gav følgende fejl. Argument af typen '(Promise | Promise)[]' kan ikke tildeles til parameter af typen 'Iterable
'. [...]
Nedenfor et forenklet eksempel på det, jeg henviser til:
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
Dog fungerer koden nedenfor, som jeg ville forvente.
const promise1 = Promise.resolve(true);
const promise2 = Promise.resolve('promise...');
Promise.all([promise1, promise2]);
Det virker som en fejl for mig, men jeg er ikke sikker. Jeg har kigget gennem GitHub og søgt efter dette problem, men jeg fandt ikke noget, der matchede. Eller gør jeg noget forkert, og findes der en løsning, så man kan overvinde problemet? Selvfølgelig kan jeg ikke bare skrive Promise.all([promise1, promise2]) i min primære kode, fordi arrayet af promises er dynamisk.
Jeg bruger TypeScript @3.9.6.
Svar #1
Problemet har intet at gøre med Promises i sig selv, men snarere med den måde, TypeScript udleder typen af et tuple på.
Du kan læse mere om det faktiske problem i dette svar, men essensen af det er følgende
const a = [1, "a", true] //<- (string | number | boolean)[], not [number, string, boolean]
Problemet bør være løst med introduktionen af variadiske typer i TS 4.0. For nu er der to måder at gøre, hvad du vil.
Den første er const-assertioner
const b = [1, "a", true] as const // <- [number, string, boolean]
Og den anden er at bruge en hjælpefunktion som den, der er vist i svaret, jeg linkede til ovenfor.
I dit specifikke tilfælde spiller den måde, Promise.all er typet på, ikke godt sammen med, hvordan TS udleder typen af promises. Dette kan nemt løses ved at have en korrekt tuple med en af de metoder, der er beskrevet ovenfor.
Legeplads link
