Przejdź do treści
webtype.orgwebtype.org#266 zip-object · par 5

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Nr 266 · 18 września 2026 · Bezlitosna

    Zepnij obiekt

    Zaimplementuj `ZipObject<Keys, Values>`, aby odpowiadające sobie pozycje krotek stały się właściwościami obiektu. Zatrzymaj się, gdy skończy się któraś krotka.

    01

    Spróbuj rozwiązać samodzielnie

    Par 5

    Zagadka

    zip-object.ts
    type Prettify<T> = { [K in keyof T]: T[K] }
    Podejście 1 z 5Jeszcze nie sprawdzone

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

    Testy

    3
    • ZipObject<['id', 'name'], [1, 'Ada']>
      { id: 1; name: 'Ada' }
    • ZipObject<['a'], [true, false]>
      { a: true }
    • ZipObject<['a', 'b'], [1]>
      { a: 1 }

    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 19 września 2026

    Rozwiązanie

    type ZipObject<
      Keys extends readonly PropertyKey[],
      Values extends readonly unknown[]
    > = Prettify<
      Keys extends readonly [infer K extends PropertyKey, ...infer KR extends PropertyKey[]]
        ? Values extends readonly [infer V, ...infer VR]
          ? { [P in K]: V } & ZipObject<KR, VR>
          : {}
        : {}
    >

    Najczęstsza błędna odpowiedź

    type ZipObject<Keys extends readonly PropertyKey[], Values extends readonly unknown[]> =
      Keys extends readonly [infer K extends PropertyKey, ...infer KR extends PropertyKey[]]
        ? Values extends readonly [infer V, ...infer VR]
          ? { [P in K]: V } & ZipObject<KR, VR>
          : {}
        : {}

    Właściwości są poprawne, ale wynik pozostaje przecięciem obiektów z jedną właściwością. Przypisywalność to przyjmie; ten sprawdzacz wymaga dokładnej tożsamości, więc końcowe mapowanie jest częścią odpowiedzi.

    Linia po linii

    1. { [P in K]: V } & ZipObject<KR, VR>

      Każdy przebieg zużywa jedną pozycję z obu krotek i przecina tę właściwość z resztą zbudowaną rekurencyjnie.

    2. Prettify<

      Mapowanie po zgromadzonych kluczach materializuje jeden zwykły typ obiektu — dokładnie taki, jaki nazywają testy.

    Do zapamiętania

    Rekurencyjne konstruktory obiektów często gromadzą przecięcia. Końcowe mapowanie tożsamościowe nie jest kosmetyką, gdy liczy się dokładna równość.

    Wykorzystuje