TypeScript-Hashmap / Wörterbuch-Schnittstelle


97

Ich bin neu in der Verwendung von TypeScript und versuche, eine Hashmap / Dictionary-Schnittstelle zu implementieren. Soweit habe ich

export interface IHash {
    [details: string] : string;
} 

Ich habe Probleme zu verstehen, was genau diese Syntax bedeutet. Wenn ich tun var x : IHash = {};würde, wie würde ich vorgehen, um die Daten hinzuzufügen / darauf zuzugreifen?

Antworten:


136

Genau wie ein normales js-Objekt:

let myhash: IHash = {};   

myhash["somestring"] = "value"; //set

let value = myhash["somestring"]; //get

Es gibt zwei Dinge, mit denen Sie arbeiten [indexer: string] : string

  • Teilen Sie TypeScript mit, dass das Objekt einen beliebigen stringbasierten Schlüssel haben kann
  • dass für alle Schlüsseleinträge der Wert ein Zeichenfolgentyp sein muss.

Geben Sie hier die Bildbeschreibung ein

Mit können Sie ein allgemeines Wörterbuch mit explizit eingegebenen Feldern erstellen [key: string]: any;

Geben Sie hier die Bildbeschreibung ein

zB agemuss sein number, während namemuss eine Zeichenfolge sein - beide sind erforderlich. Jedes implizite Feld kann eine beliebige Art von Wert sein.

Alternativ gibt es eine MapKlasse:

let map = new Map<object, string>(); 

let key = new Object();

map.set(key, "value");
map.get(key); // return "value"

Auf diese Weise können Sie jedes Objekt haben Instanz (nicht nur Nummer / string) als Schlüssel.

Obwohl es relativ neu ist, müssen Sie es möglicherweise mehrfach füllen, wenn Sie auf alte Systeme abzielen.


1
"sofern nicht ausdrücklich anders angegeben" - und wie könnte es angegeben werden? AFAIK, jedes explizit angegebene Feld muss der Indexsignatur entsprechen.
— Cerberus

huh ... du hast vollkommen recht. Entweder habe ich es mit der Eingabe verwechselt anyoder sie haben dieses Verhalten geändert. Ersteres würde ich wetten. Vielen Dank. :)
— Meirion Hughes

8
var x : IHash = {};
x['key1'] = 'value1';
x['key2'] = 'value2';

console.log(x['key1']);
// outputs value1

console.log(x['key2']);
// outputs value2

Wenn Sie dann Ihr Wörterbuch durchlaufen möchten, können Sie verwenden.

Object.keys(x).forEach((key) => {console.log(x[key])});

Object.keys gibt alle Eigenschaften eines Objekts zurück, sodass alle Werte von Objekten im Wörterbuchstil zurückgegeben werden können.

Sie haben in Ihrer Frage auch eine Hashmap erwähnt. Die obige Definition gilt für eine Benutzeroberfläche im Wörterbuchstil. Daher sind die Schlüssel eindeutig, die Werte jedoch nicht.

Sie können es wie ein Hashset verwenden, indem Sie dem Schlüssel und seinem Wert denselben Wert zuweisen.

Wenn Sie möchten, dass die Schlüssel eindeutig sind und möglicherweise unterschiedliche Werte aufweisen, müssen Sie nur überprüfen, ob der Schlüssel auf dem Objekt vorhanden ist, bevor Sie ihn hinzufügen.

var valueToAdd = 'one';
if(!x[valueToAdd])
   x[valueToAdd] = valueToAdd;

oder Sie könnten Ihre eigene Klasse aufbauen, um als eine Art Hashset zu fungieren.

Class HashSet{
  private var keys: IHash = {};
  private var values: string[] = [];

  public Add(key: string){
    if(!keys[key]){
      values.push(key);
      keys[key] = key;
    }
  }

  public GetValues(){
    // slicing the array will return it by value so users cannot accidentally
    // start playing around with your array
    return values.slice();
  }
}

7

Am einfachsten und korrektesten ist es, den Datensatztyp Record <string, string> zu verwenden

const myVar : Record<string, string> = {
   key1: 'val1',
   key2: 'val2',
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.