Gegeben den folgenden Code
interface IPerson {
firstName: string;
lastName: string;
}
var persons: { [id: string]: IPerson; } = {
"p1": { firstName: "F1", lastName: "L1" },
"p2": { firstName: "F2" }
};
Warum wird die Initialisierung nicht abgelehnt? Schließlich hat das zweite Objekt nicht die Eigenschaft "lastName".
Index signatures are incompatible.
Type '{ firstName: string; }' is not assignable to type 'IPerson'.
Property 'lastName' is missing in type '{ firstName: string; }'.
Antworten:
Bearbeiten : Dies wurde seitdem in den neuesten TS-Versionen behoben. Zitat von @ Simon_Weavers Kommentar zum Beitrag des OP:
Anscheinend funktioniert dies nicht, wenn die ursprünglichen Daten bei der Deklaration übergeben werden. Ich denke, dies ist ein Fehler in TypeScript, daher sollten Sie einen auf der Projektsite auslösen.
Sie können das typisierte Wörterbuch verwenden, indem Sie Ihr Beispiel in Deklaration und Initialisierung aufteilen, wie z.
quelle
id
Symbol? Es scheint unnötig.id
Symbol können Sie den Typ der Schlüssel des Wörterbuchs festlegen. Mit der obigen Erklärung konnten Sie Folgendes nicht tun:persons[1] = { firstName: 'F1', lastName: 'L1' }
id
Symbol kann beliebig benannt werden und wurde so gestaltet, dass das Lesen von Code erleichtert wird. zB{ [username: string] : IPerson; }
Für die Verwendung eines Wörterbuchobjekts in Typoskript können Sie die folgende Schnittstelle verwenden:
Verwenden Sie dies für Ihren Klasseneigenschaftstyp.
um diese Klasse zu verwenden und zu initialisieren,
quelle
Ich stimme thomaux zu, dass der Fehler bei der Überprüfung des Initialisierungstyps ein TypeScript-Fehler ist. Ich wollte jedoch immer noch einen Weg finden, ein Wörterbuch in einer einzelnen Anweisung mit korrekter Typprüfung zu deklarieren und zu initialisieren. Diese Implementierung ist länger, fügt jedoch zusätzliche Funktionen wie a
containsKey(key: string)
undremove(key: string)
method hinzu. Ich vermute, dass dies vereinfacht werden könnte, sobald Generika in der Version 0.9 verfügbar sind.Zuerst deklarieren wir die Basis-Dictionary-Klasse und die Schnittstelle. Die Schnittstelle wird für den Indexer benötigt, da Klassen sie nicht implementieren können.
Jetzt deklarieren wir den personenbezogenen Typ und die Dictionary / Dictionary-Schnittstelle. Beachten Sie im PersonDictionary, wie wir die richtigen Typen überschreiben
values()
undtoLookup()
zurückgeben.Und hier ist ein einfaches Initialisierungs- und Verwendungsbeispiel:
quelle
containsKey(key: string): bool;
funktioniert nicht mit TypeScript 1.5.0-beta . Es sollte geändert werden zucontainsKey(key: string): boolean;
.Hier ist eine allgemeinere Dictionary-Implementierung, die von @dmck inspiriert wurde
quelle
Wenn Sie eine Eigenschaft ignorieren möchten, markieren Sie sie als optional, indem Sie ein Fragezeichen hinzufügen:
quelle
Jetzt gibt es eine Bibliothek, die stark typisierte, abfragbare Sammlungen in Typoskript bereitstellt .
Diese Sammlungen sind:
Die Bibliothek heißt ts-generic-collection-linq .
Quellcode auf GitHub:
https://github.com/VeritasSoftware/ts-generic-collections
NPM:
https://www.npmjs.com/package/ts-generic-collections-linq
Mit dieser Bibliothek können Sie Sammlungen (wie
List<T>
) erstellen und wie unten gezeigt abfragen.quelle