Rozwiązanie z komentarzem
Opublikowano 26 sierpnia 2026Rozwią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 & BPrzecię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
K in keyof A | keyof BMapowanie 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ą.
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.
