ProgrammierungFullstack Entwickler

Wie funktionieren Indexed Access Types (Indexzugriffs-Typen, wie T[K])? Wann wendet man sie an, wie vermeidet man Fehler bei der Änderung der Typstruktur und welche Rolle spielen sie in komplexen Objekten?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

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.

Beispiel:
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

Wozu:

  • Zur Erstellung von Konstruktionstypen (z. B. Extraktion des Typwerts nach Schlüssel aus komplexen verschachtelten Strukturen).
  • Aufbau von zugehörigen Typen (Record, Pick usw.)

Feinheiten:

  • Bei der Änderung des Ausgangstyps (Person) ändert sich auch das Ergebnis des Indexzugriffs, was unerwartete Auswirkungen auf die Bindung an allen Stellen haben kann!
  • TS erkennt die Situation nicht, wenn der Schlüssel nicht existiert: Person['salary'] — Fehler zur Kompilierungszeit.

Fangfrage

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"'.

Beispiele für echte Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas.


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.