Indexed Access Types (oder Indexzugriffs-Typen) ermöglichen den Verweis auf den Typ einer bestimmten Eigenschaft eines Objekts oder eines beliebigen Schlüssels über die Syntax T[K]. Dies ist ein leistungsstarkes Werkzeug zur Erstellung flexibler und typsicherer Abstraktionen.
type Person = { name: string; age: number; }; type NameType = Person['name']; // string type AgeOrName = Person['age' | 'name']; // number | string
Sie werden verwendet, um generische Typen und Funktionen zu schreiben:
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; // korrekte Typisierung der Rückgabe } const user = { email: 'a@a.ru', id: 1 }; let id = getProperty(user, 'id'); // id: number
Person['salary'] — Fehler zur Kompilierungszeit.Frage: Welcher Typ ergibt sich aus dem Ausdruck type Foo = {a: number, b: string}["a" | "b" | "c"]?
Antwort: Dieses Beispiel verursacht einen Kompilierungsfehler, weil 'c' kein Schlüssel in dem Typ ist, auf den zugegriffen wird. TypeScript gibt den Fehler aus:
Type '"c"' does not satisfy the constraint '"a" | "b"'.
Geschichte
Im Projekt wurden dynamisch Formulare basierend auf Typen generiert. Nach der Hinzufügung eines neuen Feldes zum Haupttyp wurden die Stellen mit der Indizierung nach Schlüsseln nicht aktualisiert, wodurch einige Eigenschaften nicht im Formular erschienen, obwohl auf der Typ-Ebene eine vollständige Zuordnung erwartet wurde. Der Fehler trat nur zur Laufzeit auf, nicht in der Entwicklungsphase.
Geschichte
In einer Datenvalidierungsbibliothek wurde indexierter Zugriff über Typen verwendet, aber bei der Migration von Code wurde einer der Schlüssel vom Objekt in den Elternteil verschoben. Der alte indexierte Typ führte zu einem Kompilierungsfehler, der jedoch erst nach dem Neuaufbau aufgrund des Caches im CI auftrat und zuvor mehrere Wochen auf Staging lebte.
Geschichte
Es wurde fälschlicherweise angenommen, dass mit Hilfe von Indexed Access Types auf jeden Schlüssel zugegriffen werden kann, auch wenn er nicht explizit aufgeführt ist, was zu einer fehlerhaften Generierung automatisierter Tests für dynamische Eigenschaften führte. Infolgedessen deckten die Tests nicht einen Teil möglicher Szenarien ab, da der Compiler diese Fälle als ungültig auswarf.