Der Utility-Typ Pick<T, K> wurde in TypeScript eingeführt, um die selektive Kopie von Teilen der Felder aus einem bestehenden Typ oder einer Schnittstelle zu lösen.
Oft werden bei der Entwicklung dieselben Datenstrukturen mit geringfügigen Variationen wiederverwendet. Vor der Einführung von Pick musste man neue Schnittstellen erstellen, indem man die benötigten Felder manuell kopiert hat, was zu Code-Duplikation und Fehlern bei weiteren Änderungen der ursprünglichen Strukturen führte.
Es ist notwendig, die Eingangs- oder Ausgangsdaten einer Funktion zu typisieren, indem man nur einen Teil der Felder eines großen Interfaces verwendet, um Redundanz zu vermeiden und den Vertrag so konkret wie möglich zu gestalten.
Pick löst das Problem, eine Teilmenge der Eigenschaften des Typs T anhand der Schlüssel K auszuwählen:
type Pick<T, K extends keyof T> = { [P in K]: T[P] };
Beispiel:
interface User { id: number; name: string; email: string; } type Credentials = Pick<User, 'email' | 'name'>; const creds: Credentials = { email: "user@example.com", name: "User Name", };
Wesentliche Merkmale:
Worin besteht der Unterschied zwischen Pick und Omit?
Pick wählt nur die aufgelisteten Felder des Typs; Omit schließt sie im Gegensatz dazu von der Struktur aus.
type PartialUser = Omit<User, 'id'>; // Alle Felder außer id
Kann man mit Pick eine nicht vorhandene Eigenschaft auswählen?
Nein, die Schlüssel K müssen zwingend Schlüssel des ursprünglichen Typs sein, sonst tritt ein Kompilierungsfehler auf.
Kann Pick die Optionalität oder readonly-Eigenschaften beeinflussen?
Pick behält die Modifikatoren der Eigenschaften (optional, readonly) bei, wenn sie im ursprünglichen Typ vorhanden sind; es kopiert sie einfach in den neuen Typ.
Bei der Arbeit mit einem Eingabeformular hat der Entwickler einen eigenen Typ manuell beschrieben und dabei das neue erforderliche Attribut, das zu User hinzugefügt wurde, vergessen. Das Formular brach nach der Aktualisierung der Schnittstelle zusammen.
Vorteile:
Nachteile:
Pick wird verwendet, um die benötigten Felder des Formulars auszuwählen:
type FormFields = Pick<User, 'email' | 'name'>;
Änderungen in User spiegeln sich automatisch im Formular wider.
Vorteile:
Nachteile: