Przejdź do treści
webtype.org#212 rebuild-pick · par 2

Nr 212 · 20 lipca 2026 · Łatwa

Odtwórz Pick

Zaimplementuj `MyPick<T, K>` tak, aby zachował tylko klucze wymienione w `K`. To wbudowany `Pick` napisany ręcznie — jeden typ mapowany, bez warunków.

01

Spróbuj rozwiązać samodzielnie

Par 2

Zagadka

rebuild-pick.ts
interface Todo {
  title: string
  description: string
  done: boolean
}
Podejście 1 z 2Jeszcze nie sprawdzone

Zastąp ??? — rozwiązanie sprawdzamy przypadkami poniżej.

Testy

3
  • MyPick<Todo, 'title'>
    { title: string }
  • MyPick<Todo, 'title' | 'done'>
    { title: string; done: boolean }
  • MyPick<Todo, never>
    {}

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

Nobody is counting yet. Score distribution and the gra na krótkim dystansie board arrive with accounts — until then your results stay on this device.

Archiwum
02

Rozwiązanie z komentarzem

Opublikowano 21 lipca 2026

Rozwiązanie

type MyPick<T, K extends keyof T> = { [P in K]: T[P] }

Najczęstsza błędna odpowiedź

type MyPick<T, K extends keyof T> = { [P in keyof T]: T[P] }

Mapowanie po `keyof T` kopiuje cały obiekt — `K` nigdy nie jest brane pod uwagę. Wyrażenie po `in` to zbiór kluczy, który budujesz, a nie ten, z którego czytasz.

Linia po linii

  1. { [P in K]: ... }

    `K` to unia kluczy literalnych. Typ mapowany rozdziela się po tej unii, tworząc jedną właściwość na każdy element.

  2. T[P]

    Dostęp indeksowany. Ponieważ `K extends keyof T`, `P` jest zawsze prawdziwym kluczem `T`, więc typ nigdy nie rozszerza się do `unknown`.

Do zapamiętania

Typ mapowany czyta się jako `{ [Nazwa in ZbiórKluczy]: TypWartości }`. Wszystko dalej w tej ścieżce to wariacja na ten temat.