Przejdź do treści
webtype.orgMapped types

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    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.