Przejdź do treści
webtype.org#213 unwrap-promise · par 3

Nr 213 · 21 lipca 2026 · Średnia

Rozpakuj

Zaimplementuj `Unwrap<T>`, aby zdejmował każdą warstwę `Promise`, niezależnie od zagnieżdżenia. Typ niebędący obietnicą przechodzi bez zmian.

01

Spróbuj rozwiązać samodzielnie

Par 3

Zagadka

unwrap-promise.ts
Podejście 1 z 3Jeszcze nie sprawdzone

Zastąp ??? — rozwiązanie sprawdzamy przypadkami poniżej.

Testy

4
  • Unwrap<Promise<string>>
    string
  • Unwrap<Promise<Promise<number>>>
    number
  • Unwrap<boolean>
    boolean
  • Unwrap<Promise<Promise<Promise<null>>>>
    null

Jak oceniamy test Dokładna równość typów, nie przypisywalność — przecięcie to nie to samo co spłaszczony obiekt.

Jak poszło innym

Nobody is counting yet. Score distribution and the gra na krótkim dystansie board arrive with accounts — until then your results stay on this device.

Archiwum
02

Rozwiązanie z komentarzem

Opublikowano 22 lipca 2026

Rozwiązanie

type Unwrap<T> = T extends Promise<infer Inner> ? Unwrap<Inner> : T

Najczęstsza błędna odpowiedź

type Unwrap<T> = T extends Promise<infer Inner> ? Inner : T

To zdejmuje dokładnie jedną warstwę. `Promise<Promise<number>>` staje się `Promise<number>` i na tym koniec. Dopiero wywołanie rekurencyjne czyni to kompletnym.

Linia po linii

  1. T extends Promise<infer Inner>

    Dopasowuje `T` do kształtu `Promise<coś>` i wiąże to coś z `Inner`.

  2. ? Unwrap<Inner>

    Rekurencja. `Inner` samo może być obietnicą, więc to samo pytanie zadawane jest ponownie, aż odpowiedź brzmi „nie”.

  3. : T

    Przypadek bazowy. To nie obietnica, więc `T` jest już typem wartości.

Do zapamiętania

Typ warunkowy wywołujący sam siebie w gałęzi prawdziwej to odpowiednik pętli `while` na poziomie typów. Gałąź fałszywa jest wyjściem.