Konstrukcje
Mapped types
Pętla po unii kluczy budująca typ obiektu.
Czym jest
Czytaj `{ [K in Keys]: Value }` jako: dla każdego `K` w tym zbiorze kluczy stwórz właściwość o nazwie `K`, której typem jest to wyrażenie. Dwie niezależne decyzje na klucz — jak się nazywa, przez opcjonalną klauzulę `as`, i co przechowuje. `Partial`, `Required`, `Readonly`, `Pick` i `Record` to każdy jedna linia tego.
Przykłady
Stringify<User>
→{ id: string; name: string; }Prefixed<User>
→{ getId: number; getName: string; }Klauzula `as` zmienia nazwę klucza. Tak typ mapowany tworzy nazwy, których nie było na wejściu.
Filtered<User>
→{ name: string; }Zmiana nazwy klucza na `never` usuwa go. To jedyny sposób, w jaki typ mapowany może odrzucić właściwość.
Każdy rozwinięty typ powyżej wypisał TypeScript 5.9.3, nie ręka człowieka.
Czego nie robi
- Nie potrafi usunąć klucza od strony wartości. Wyprodukowanie `never` jako *typu* właściwości zostawia klucz obecny i niewypełnialny, co nie jest tym samym co nieobecny.
- Przestaje zachowywać modyfikatory w chwili, gdy zbiór kluczy jest obliczany. `[K in keyof T]` jest homomorficzne i zachowuje `readonly` oraz `?`; dodaj klauzulę `as` albo połącz klucze unią, a znikną, chyba że dodasz je z powrotem.
Wniosek
Klucze rozstrzyga klauzula klucza, a wartości klauzula wartości. Większość błędów w typach mapowanych to jedna z tych odpowiedzi użyta przypadkiem zamiast drugiej.