129 votes

Interface hashmap/dictionnaire TypeScript

Je suis nouveau dans l'utilisation de TypeScript et j'essaie d'implémenter une interface hashmap/dictionary. Jusqu'à présent, j'ai

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

J'ai du mal à comprendre ce que signifie exactement cette syntaxe. Si je devais faire var x : IHash = {}; comment faire pour ajouter/accéder aux données ?

176voto

Meirion Hughes Points 1855

Tout comme un objet js normal :

let myhash: IHash = {};   

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

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

Il y a deux choses que vous faites avec [indexer: string] : string

  • indique à TypeScript que l'objet peut avoir n'importe quelle clé basée sur une chaîne de caractères.
  • que pour toutes les entrées de clé, la valeur DOIT être un type de chaîne.

enter image description here

Vous pouvez créer un dictionnaire général avec des champs explicitement typés en utilisant la commande [key: string]: any;

enter image description here

par exemple age doit être number alors que name doit être une chaîne de caractères - les deux sont obligatoires. Tout champ implicite peut être un type de valeur quelconque.

Comme alternative, il existe un Map classe :

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

let key = new Object();

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

Cela vous permet d'avoir n'importe quel objet instance (pas seulement un numéro ou une chaîne) comme clé.

Bien qu'il soit relativement nouveau, il se peut que vous deviez le polyfill si vous ciblez des systèmes anciens.

1 votes

"à moins qu'il ne soit explicitement tapé autrement" - et comment cela pourrait-il être énoncé ? AFAIK, tout champ indiqué explicitement doit être conforme à la signature de l'index.

0 votes

huh... tu as tout à fait raison. soit j'ai confondu avec le fait de le taper comme any ou ils ont changé ce comportement. Je parierais sur le premier. Merci. :)

35voto

aWebDeveloper Points 5546

La manière la plus simple et la plus correcte est d'utiliser Type d'enregistrement Record<string, string>

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

8voto

C Smith Points 162
var x : IHash = {};
x['key1'] = 'value1';
x['key2'] = 'value2';

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

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

Si vous souhaitez ensuite itérer dans votre dictionnaire, vous pouvez utiliser.

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

Object.keys renvoie toutes les propriétés d'un objet, et fonctionne donc très bien pour renvoyer toutes les valeurs des objets de type dictionnaire.

Vous avez également mentionné un hashmap dans votre question, la définition ci-dessus est pour une interface de style dictionnaire. Par conséquent, les clés seront uniques, mais pas les valeurs.

Vous pourriez l'utiliser comme un hashset en attribuant simplement la même valeur à la clé et à sa valeur.

si vous voulez que les clés soient uniques et avec des valeurs potentiellement différentes, il suffit de vérifier si la clé existe sur l'objet avant de l'ajouter.

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

ou vous pouvez construire votre propre classe pour agir comme une sorte 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();
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X