Interfejs hashmap / słownik języka TypeScript


104

Jestem nowy w używaniu TypeScript i próbuję zaimplementować interfejs hashmap / Dictionary. Jak dotąd mam

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

Mam problem ze zrozumieniem, co dokładnie oznacza ta składnia. Gdybym miał to zrobić, w var x : IHash = {};jaki sposób powinienem dodać / uzyskać dostęp do danych?

Odpowiedzi:


145

Tak jak zwykły obiekt js:

let myhash: IHash = {};   

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

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

Robisz dwie rzeczy [indexer: string] : string

  • powiedz TypeScript, że obiekt może mieć dowolny klucz oparty na łańcuchach
  • że dla wszystkich wpisów klucza wartość MUSI być typu łańcuchowego.

wprowadź opis obrazu tutaj

Możesz utworzyć słownik ogólny z jawnie wpisanymi polami przy użyciu [key: string]: any;

wprowadź opis obrazu tutaj

np. agemusi być number, a namemusi być ciągiem znaków - oba są wymagane. Każde pole niejawne może mieć dowolny typ wartości.

Alternatywnie istnieje Mapklasa:

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

let key = new Object();

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

Dzięki temu możesz mieć dowolną instancję Object (nie tylko liczbę / ciąg) jako klucz.

Chociaż jest stosunkowo nowy, być może będziesz musiał go wypełnić, jeśli celujesz w stare systemy.


1
„chyba że wyraźnie podano inaczej” - i jak można to określić? AFAIK, każde pole podane wyraźnie musi być zgodne z podpisem indeksu.
— Cerberus

huh ... masz całkowitą rację. albo pomyliłem to z pisaniem jako, anyalbo oni zmienili to zachowanie. Postawiłbym to pierwsze. Dzięki. :)
— Meirion Hughes

12

Najprostszym i poprawnym sposobem jest użycie typu rekordu Record <string, string>

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

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

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

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

Jeśli chcesz później iterować w swoim słowniku, możesz użyć.

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

Object.keys zwraca wszystkie właściwości obiektu, więc działa dobrze przy zwracaniu wszystkich wartości z obiektów stylizowanych na słownik.

W swoim pytaniu wspomniałeś również o hashmie, powyższa definicja dotyczy interfejsu w stylu słownikowym. Dlatego klucze będą unikalne, ale wartości nie.

Możesz go użyć jak skrótu, po prostu przypisując tę ​​samą wartość do klucza i jego wartości.

jeśli chcesz, aby klucze były unikalne i miały potencjalnie różne wartości, musisz po prostu sprawdzić, czy klucz istnieje w obiekcie przed dodaniem do niego.

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

lub możesz zbudować własną klasę, która będzie działała jak rodzaj skrótu.

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();
  }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.