Przejdź do treści
#242 merge-objects · par 3

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Nr 242 · 25 sierpnia 2026 · Średnia

    Scal

    Zaimplementuj `Merge<A, B>`, aby łączył dwa typy obiektowe w jeden płaski obiekt. Gdy oba definiują ten sam klucz, wygrywa `B`.

    01

    Spróbuj rozwiązać samodzielnie

    Par 3

    Zagadka

    merge-objects.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
    • Merge<{ a: string }, { b: number }>
      { a: string; b: number }
    • Merge<{ a: string }, { a: number }>
      { a: number }
    • Merge<{}, { a: 1 }>
      { a: 1 }
    • Merge<{ a: 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 26 sierpnia 2026

    Rozwiązanie

    type Merge<A, B> = {
      [K in keyof A | keyof B]: K extends keyof B
        ? B[K]
        : K extends keyof A
          ? A[K]
          : never
    }

    Najczęstsza błędna odpowiedź

    type Merge<A, B> = A & B

    Przecięcie to nie scalenie. Dla rozłącznych kluczy to jedynie zły *kształt* — przypisywalny do odpowiedzi, ale jej nierówny. Dla wspólnego klucza jest wręcz błędne: `{ a: string } & { a: number }` żąda wartości będącej jednym i drugim, więc właściwość staje się `never`, zamiast pozwolić `B` nadpisać `A`.

    Linia po linii

    1. K in keyof A | keyof B

      Mapowanie po unii obu zbiorów kluczy daje jeden płaski obiekt. Ponieważ zbiór kluczy jest wyliczany, a nie jest gołym `keyof T`, to mapowanie nie jest homomorficzne — modyfikatory z obu źródeł przepadają.

    2. K extends keyof B ? B[K]

      Pierwszeństwo wyraża się kolejnością. Sprawdzenie `B` jako pierwszego sprawia, że wspólny klucz rozstrzyga się na typ z `B`, a `A` nie jest w ogóle pytane; zamiana gałęzi dałaby scalenie z wygraną `A` bez żadnego kosztu.

    Do zapamiętania

    Przecięcie składa ograniczenia; scalanie je zastępuje. Pokrywają się tylko wtedy, gdy zbiory kluczy są rozłączne — dlatego `A & B` wydaje się działać dokładnie do chwili, gdy dwa obiekty dzielą pole.

    Wykorzystuje