Zaimplementuj `MyPartial<T>`, aby każda właściwość stała się opcjonalna. Dopuszczenie `undefined` w wartości to nie to samo — opcjonalny musi stać się sam klucz.
01
Spróbuj rozwiązać samodzielnie
Par 2
Zagadka
rebuild-partial.ts
interface User {
id: number
name: string
}
type MyPartial<T> = ???
Podejście 1 z 2Jeszcze nie sprawdzone
Zastąp ??? — rozwiązanie sprawdzamy przypadkami poniżej. Tab wcina; naciśnij Escape, a potem Tab, by wyjść fokusem.
Testy
3
MyPartial<User>—
→ { id?: number; name?: string }
MyPartial<{ a: string }>—
→ { a?: string }
MyPartial<{}>—
→ {}
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ć.
To rozszerza typ wartości, ale klucz pozostaje wymagany: nadal trzeba napisać `{ id: undefined }` zamiast go pominąć. Opcjonalność i „może być undefined” to naprawdę różne rzeczy, a testy dokładnej równości je rozróżniają.
Linia po linii
{ [K in keyof T]?: T[K] }
Znak `?` to modyfikator typu mapowanego. Stoi między klauzulą klucza a dwukropkiem i dodaje opcjonalność każdemu wytworzonemu kluczowi.
keyof T
Mapowanie po `keyof T`, a nie po podanym zbiorze kluczy, sprawia, że dotyczy to całego obiektu. Porównaj z `Pick`, gdzie zbiór kluczy jest argumentem.
Do zapamiętania
Modyfikatory (`?` i `readonly`) doczepiają się do mapowania, nie do wartości. `-?` i `-readonly` je zdejmują — tak właśnie napisany jest `Required`.