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)
und remove(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.
interface IDictionary {
add(key: string, value: any): void;
remove(key: string): void;
containsKey(key: string): bool;
keys(): string[];
values(): any[];
}
class Dictionary {
_keys: string[] = new string[];
_values: any[] = new any[];
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 personenbezogenen Typ und die Dictionary / Dictionary-Schnittstelle. Beachten Sie im PersonDictionary, wie wir die richtigen Typen überschreiben values()
und toLookup()
zurückgeben.
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("Key no longer exists");
// alert: Key no longer exists
}
alert(persons.keys().join(", "));
// alert: p1, p3
Index signatures are incompatible.
Type '{ firstName: string; }' is not assignable to type 'IPerson'.
Property 'lastName' is missing in type '{ firstName: string; }'.