Przejdź do treści
webtype.orgwebtype.org

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Nr 277 · 29 września 2026 · Średnia

    Czy to unia?

    Zaimplementuj IsUnion<T>, aby unia wielu składników dawała true, pojedynczy typ false, a never również false.

    01

    Spróbuj rozwiązać samodzielnie

    Par 3

    Zagadka

    is-union.ts
    Podejście 1 z 3Jeszcze nie sprawdzone

    Zastąp ??? — rozwiązanie sprawdzamy przypadkami poniżej. Tab wcina; naciśnij Escape, a potem Tab, by wyjść fokusem.

    Testy

    3
    • IsUnion<string | number>—
      → true
    • IsUnion<string>—
      → false
    • IsUnion<never>—
      → false

    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

    Tę zagadkę rozwiązało jak dotąd mniej niż 5 osób. Rozkład pojawi się, gdy próbka będzie na tyle duża, by coś znaczyć.

    Gra na krótkim dystansie

    Najmniej znaków

    Nie ma jeszcze publicznych wyników.

    Archiwum
    02

    Rozwiązanie z komentarzem

    Opublikowano 30 września 2026

    Rozwiązanie

    type IsUnion<T, Whole = T> =
      [T] extends [never]
        ? false
        : T extends Whole
          ? [Whole] extends [T] ? false : true
          : never

    Najczęstsza błędna odpowiedź

    type IsUnion<T, Whole = T> = T extends Whole ? [Whole] extends [T] ? false : true : never

    Obsługuje zwykłe typy i unie, ale nagi warunek dla never wykonuje się zero razy i zwraca never. Tylko jawny opakowany warunek ma szansę nazwać go false.

    Linia po linii

    1. [Whole] extends [T]

      W rozdzielonej gałęzi T jest jednym składnikiem, a Whole nadal trzyma pierwotną unię. Opakowane porównanie wykrywa różnicę bez ponownego rozdzielania.

    Do zapamiętania

    Wykrywanie unii polega na porównaniu jednego rozdzielonego składnika z zachowaną całością; never potrzebuje osobnej ochrony, bo nie tworzy żadnych składników.

    Wykorzystuje