TypeScript ermöglicht die Beschreibung von Objekten mit dynamischen Eigenschaftsnamen, wenn nicht alle Schlüssel im Voraus definiert werden können. Dafür werden Indexsignaturen verwendet, die als Möglichkeit zur Typisierung von Variablenobjekten (Maps, Daten von externen Servern usw.) entstanden sind.
Ohne Indexsignatur wird ein Objekt nur nach vorab festgelegten Schlüsseln wahrgenommen, und alle anderen führen zu einem Kompilierungsfehler. Eine falsche Deklaration der Signatur kann die Typen aller Eigenschaften des Objekts verwässern, die strikte Typisierung verringern und zu Fehlern führen.
Deklarieren Sie die Indexsignatur ausdrücklich nur dort, wo es gerechtfertigt ist. Verwenden Sie zur Typisierung eines Arrays von Objekten nach einem String-Schlüssel folgende Form:
Beispielcode:
interface Dictionary { [key: string]: number; length?: number; } const sample: Dictionary = { apples: 4, oranges: 10 }; sample['bananas'] = 6;
Wesentliche Merkmale:
Kann man verschiedene Typen für verschiedene Schlüssel in der Indexsignatur angeben?
Nein, der Typ gilt für das gesamte Schlüsselset. Wenn Sie [key: string]: number angeben, muss auch sample.length vom Typ number sein: Dies führt häufig zu Fehlern bei der gleichzeitigen Verwendung von Indexsignatur und bekannten Eigenschaften.
Kann man Indexsignaturen mit Symbolen (symbol) verwenden?
Ja, seit ES6 unterstützt TypeScript die Indexsignatur mit Symbolen:
interface SymbolMap { [key: symbol]: string; }
Was passiert, wenn man ein Objekt mit einer Indexsignatur und zusätzlichen Eigenschaften eines anderen Typs deklariert?
Der Compiler gibt einen Fehler aus, wenn der Typ der Eigenschaft nicht mit dem deklarierten Typ der Indexsignatur kompatibel ist. Man kann dies umgehen, indem man einen Union-Typ verwendet oder solche Felder in ein separates Interface auslagert.
Für jede Antwort vom Server wurde das Interface {[key: string]: any} verwendet, was zu tiefgreifenden Bugs aufgrund des Verlusts der Kontrolle über die Datenstruktur führte.
Vorteile:
Nachteile:
Verwendung von Indexsignaturen strikt für Dictionaries (z.B. Konfiguration nach Schlüssel), und ausdrücklich bekannte Eigenschaften nur mit Deklaration ihres Typs außerhalb der Signatur.
Vorteile:
Nachteile: