Ich stimme thomaux zu, dass der Initialisierungsfehler für den Typencheck ein TypeScript-Bug ist. Ich wollte jedoch immer noch einen Weg finden, ein Dictionary in einer einzigen Anweisung mit korrektem Typencheck zu deklarieren und zu initialisieren. Diese Implementierung ist länger, jedoch fügt sie zusätzliche Funktionen wie eine containsKey(key: string)
und remove(key: string)
Methode hinzu. Ich vermute, dass dies vereinfacht werden könnte, sobald Generics in der Version 0.9 verfügbar sind.
Zuerst deklarieren wir die Basisklasse und das Interface für das Dictionary. Das Interface wird für den Indexer benötigt, da Klassen sie nicht implementieren können.
interface IDictionary {
add(key: string, value: any): void;
remove(key: string): void;
containsKey(key: string): boolean;
keys(): string[];
values(): any[];
}
class Dictionary {
_keys: string[] = new Array();
_values: any[] = new Array();
constructor(init: { key: string; value: any; }[]) {
for (var x = 0; x < init.length; x++) {
this[init[x].key] = init[x].value;
this._keys.push(init[x].key);
this._values.push(init[x].value);
}
}
add(key: string, value: any) {
this[key] = value;
this._keys.push(key);
this._values.push(value);
}
remove(key: string) {
var index = this._keys.indexOf(key, 0);
this._keys.splice(index, 1);
this._values.splice(index, 1);
delete this[key];
}
keys(): string[] {
return this._keys;
}
values(): any[] {
return this._values;
}
containsKey(key: string) {
if (typeof this[key] === "undefined") {
return false;
}
return true;
}
toLookup(): IDictionary {
return this;
}
}
Jetzt deklarieren wir den spezifischen Typ Person und das Dictionary/Dictionary-Interface. Im PersonDictionary sehen Sie, wie wir values()
und toLookup()
überschreiben, um die richtigen Typen zurückzugeben.
interface IPerson {
firstName: string;
lastName: string;
}
interface IPersonDictionary extends IDictionary {
[index: string]: IPerson;
values(): IPerson[];
}
class PersonDictionary extends Dictionary {
constructor(init: { key: string; value: IPerson; }[]) {
super(init);
}
values(): IPerson[]{
return this._values;
}
toLookup(): IPersonDictionary {
return this;
}
}
Und hier ist ein einfaches Initialisierungs- und Verwendungsbeispiel:
var persons = new PersonDictionary([
{ key: "p1", value: { firstName: "F1", lastName: "L2" } },
{ key: "p2", value: { firstName: "F2", lastName: "L2" } },
{ key: "p3", value: { firstName: "F3", lastName: "L3" } }
]).toLookup();
alert(persons["p1"].firstName + " " + persons["p1"].lastName);
// alert: F1 L2
persons.remove("p2");
if (!persons.containsKey("p2")) {
alert("Schlüssel existiert nicht mehr");
// alert: Schlüssel existiert nicht mehr
}
alert(persons.keys().join(", "));
// alert: p1, p3