Przejdź do treści
webtype.org#227 includes-tuple · par 3

Nr 227 · 4 sierpnia 2026 · Średnia

Zawiera

Zaimplementuj `Includes<T, U>`, aby zgłaszał, czy krotka `T` zawiera dokładnie typ `U`. `boolean` nie liczy się jako zawierające `true` — dopasowanie musi być dokładne. `Equal` z harnessa jest dostępne.

01

Spróbuj rozwiązać samodzielnie

Par 3

Zagadka

includes-tuple.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

4
  • Includes<[1, 2, 3], 2>
    true
  • Includes<[1, 2, 3], 4>
    false
  • Includes<[], 1>
    false
  • Includes<[boolean], true>
    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ć.

Archiwum
02

Rozwiązanie z komentarzem

Opublikowano 5 sierpnia 2026

Rozwiązanie

type Includes<T extends readonly unknown[], U> =
  T extends readonly [infer H, ...infer R]
    ? Equal<H, U> extends true
      ? true
      : Includes<R, U>
    : false

Najczęstsza błędna odpowiedź

type Includes<T extends readonly unknown[], U> =
  U extends T[number] ? true : false

Krótkie i błędne. `T[number]` to unia typów elementów, a `extends` pyta o przypisywalność, więc `Includes<[boolean], true>` odpowiada `true` — `true` jest przypisywalne do `boolean`, choć krotka nie zawiera takiego elementu. Przypisywalność to nie przynależność.

Linia po linii

  1. Equal<H, U> extends true

    `Equal` zwraca typ `true` albo `false`, więc trzeba go sprawdzać przez `extends true`, a nie używać wprost jako warunku. To zagadka, w której sam harness staje się narzędziem.

  2. : false

    Dojście do pustej krotki oznacza, że sprawdzono każdy element i żaden nie pasował. Wyczerpanie listy *jest* odpowiedzią przeczącą.

Do zapamiętania

Gdy zagadka mówi „dokładnie”, `extends` jest złym narzędziem — testuje przypisywalność, która jest jednokierunkowa. Dokładna tożsamość wymaga `Equal` — i dlatego każdy test na tej stronie jest na nim oparty.