Zrozumienie operatora in
w kontekście mapped types
Operator in
w TypeScript jest głównie używany w mapped types do iteracji po właściwościach danego typu unii. Pozwala na przekształcenie każdej właściwości w unii w nowy typ.
Użycie operatora in
Rozważmy scenariusz, w którym chcesz stworzyć nowy typ poprzez przekształcenie właściwości istniejącego typu. Na przykład, możesz chcieć, aby wszystkie właściwości danego typu były opcjonalne lub tylko do odczytu.
Oto podstawowy przykład użycia operatora in
:
type Person = { name: string; age: number; }; type OptionalPerson = { [P in keyof Person]?: Person[P]; };
W tym przykładzie OptionalPerson
jest mapped type, w którym każda właściwość typu Person
jest przekształcana na opcjonalną. Operator in
iteruje po keyof Person
, który jest unią kluczy "name" | "age"
.
Zaawansowany przykład
Stwórzmy mapped type, który sprawi, że właściwości będą zarówno opcjonalne, jak i tylko do odczytu:
type ReadonlyOptional<T> = { readonly [P in keyof T]?: T[P]; }; const person: ReadonlyOptional<Person> = { name: "John" }; // person.name = "Doe"; // Błąd: Nie można przypisać do 'name', ponieważ jest to właściwość tylko do odczytu.
Tutaj, ReadonlyOptional
jest mapped type, który sprawia, że każda właściwość T
jest zarówno opcjonalna, jak i tylko do odczytu, co pokazuje elastyczność, jaką zapewnia operator in
w mapped types.
Podsumowanie
Operator in
jest potężnym narzędziem w TypeScript, szczególnie w kontekście mapped types. Oferuje zwięzły sposób na przekształcanie każdej właściwości typu, umożliwiając szeroki zakres manipulacji typami. Ta zdolność jest szczególnie przydatna przy tworzeniu utility types, które muszą dostosować istniejące typy do nowych struktur lub ograniczeń.