← Wszystkie zadaniaTypeScript · Senior

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.

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.

  1. typy
    const p = all([1, Promise.resolve('a'), Promise.resolve(true)]);
    type _ = Expect<Equal<typeof p, Promise<[number, string, boolean]>>>;
  2. typy
    const p = all([1, 'x'] as const);
    type _ = Expect<Equal<typeof p, Promise<[1, 'x']>>>;
  3. typy
    const p = all([] as unknown as [Promise<Promise<number>>, string]);
    type _ = Expect<Equal<typeof p, Promise<[number, string]>>>;
  4. expect(await all([1, Promise.resolve(2), wait(20).then(() => 3)])).toEqual([1, 2, 3]);
  5. const slow = wait(30).then(() => 'slow');
    const fast = Promise.resolve('fast');
    expect(await all([slow, fast])).toEqual(['slow', 'fast']);
  6. await expect(all([Promise.resolve(1), Promise.reject(new Error('boom'))])).rejects.toThrow('boom');
  7. expect(await all([])).toEqual([]);