Typowany Promise.all dla krotek
Napisz all(values), odpowiednik Promise.all bez użycia samego Promise.all. Czeka na wszystkie wartości (obietnice lub zwykłe), zwraca wyniki w tej samej kolejności i odrzuca z pierwszym błędem.
Najważniejszy jest typ: dla all([1, Promise.resolve("a")]) wynik ma być Promise<[number, string]>, krotka, a nie (string | number)[]. Zagnieżdżone obietnice rozwijają się do wartości.
Ctrl+Enter uruchamia testy. Tab robi wcięcie; aby wyjść z edytora klawiaturą, naciśnij Esc, a potem Tab. Kod zapisuje się w tej przeglądarce.
Testy (7)
Testy typów sprawdza kompilator TypeScriptu w trybie strict. Expect<Equal<A, B>> przechodzi, gdy typy są dokładnie takie same, a // @ts-expect-error, gdy następna linia się nie kompiluje. Pierwsze uruchomienie pobiera kompilator, więc trwa kilka sekund.
- typy
const p = all([1, Promise.resolve('a'), Promise.resolve(true)]); type _ = Expect<Equal<typeof p, Promise<[number, string, boolean]>>>;
- typy
const p = all([1, 'x'] as const); type _ = Expect<Equal<typeof p, Promise<[1, 'x']>>>;
- typy
const p = all([] as unknown as [Promise<Promise<number>>, string]); type _ = Expect<Equal<typeof p, Promise<[number, string]>>>;
expect(await all([1, Promise.resolve(2), wait(20).then(() => 3)])).toEqual([1, 2, 3]);
const slow = wait(30).then(() => 'slow'); const fast = Promise.resolve('fast'); expect(await all([slow, fast])).toEqual(['slow', 'fast']);
await expect(all([Promise.resolve(1), Promise.reject(new Error('boom'))])).rejects.toThrow('boom');
expect(await all([])).toEqual([]);