Interfață hashmap/dicționar în TypeScript


Încerc să implementez o interfață pentru hashmap/dictionary. Până acum am:

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

Am unele dificultăți în a înțelege exact ce înseamnă această sintaxă. Dacă aș face var x : IHash={};, cum aș proceda pentru a adăuga/accesa datele?

Răspuns #1

La fel ca un obiect normal js:

let myhash: IHash = {};   

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

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

Sunt două lucruri pe care le faci cu [indexer: string] : string

  • spune TypeScript că obiectul poate avea orice cheie bazată pe șir de caractere
  • că pentru toate intrările cheie valoarea TREBUIE să fie de tip șir de caractere.

Poți crea un dicționar general cu câmpuri tipizate în mod explicit folosind [key: string]: any;

de exemplu, age trebuie să fie number, în timp ce name trebuie să fie un șir - ambele sunt obligatorii. Orice câmp implicit poate fi orice tip de valoare.

Ca alternativă, există o clasă Map:

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

let key = new Object();

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

Acest lucru vă permite să aveți orice instanță de Obiect (nu doar număr/șir) ca și cheie.

Deși este relativ nou, s-ar putea să fie nevoie să îl completezi cu polyfill dacă vizezi sisteme vechi.

Răspunsul #2

Cea mai simplă și corectă modalitate este să folosiți tipul Record Record<string, string>

const myVar : Record<string, string> = {
   key1: 'val1',
   key2: 'val2',
}

Răspunsul #3

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

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

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

Dacă doriți să parcurgeți apoi dicționarul dvs., puteți folosi.

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

Object.keys returnează toate proprietățile unui obiect, astfel încât funcționează bine pentru a returna toate valorile din obiecte de tip dicționar.

De asemenea, ați menționat un hashmap în întrebarea dvs., definiția de mai sus este pentru o interfață de tip dicționar. Prin urmare, cheile vor fi unice, dar valorile nu vor fi.

Ai putea să-l folosești ca un hashset doar atribuind aceeași valoare cheii și valorii sale.

dacă ai vrut ca cheile să fie unice și să aibă valori potențial diferite, atunci trebuie doar să verifici dacă cheia există în obiect înainte de a o adăuga.

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

sau ai putea să-ți construiești propria clasă pentru a acționa ca un fel de hashset.

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();
  }
}