170 votes

Interface de hachage/dictionnaire TypeScript

Je suis en train de mettre en œuvre 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 ajouterais-je / accéderais-je aux données ?

215voto

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

  • dire à 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 de type chaine de caractères.

entrez la description de l'image ici

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

entrez la description de l'image ici

par exemple, age doit être de type number, tandis que name doit être de type chaine de caractères - les deux sont requis. Tout champ implicite peut être de n'importe quel type de valeur.

Comme alternative, il existe une classe Map:

let map = new Map(); 

let key = new Object();

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

Cela vous permet d'avoir n'importe quelle instance d'objet (pas seulement des nombre/chaîne de caractères) comme clé.

Bien que relativement nouveau, vous devrez peut-être le combler si vous ciblez des systèmes anciens.

1 votes

"sauf indication contraire explicite" - et comment cela pourrait-il être formulé? AFAIK, tout champ explicitement mentionné doit être conforme à la signature d'index.

0 votes

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

0 votes

Avec le dernier TS (4.7), il y a un problème grave avec la première approche. Si je la tape comme ceci, alors pour toute key de type string, TS pensera que myhash[key] est une string, ce qui n'est évidemment pas le cas. C'est en fait assez surprenant car avec cette interprétation, il n'y a littéralement aucun objet "normal" (à moins d'utiliser Proxy) qui implémente cette interface.

101voto

aWebDeveloper Points 5546

La manière la plus simple et correcte est d'utiliser le type Record Record

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

0 votes

Pourquoi n'est-ce pas la réponse principale

0 votes

Espère que vous avez voté ;) Je suis arrivé en retard à la fête. Plus tôt, cette fonctionnalité n'existait peut-être pas

0 votes

La chose que je cherchais

10voto

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

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

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

If you would like to then iterate through your dictionary, you can use.

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

Object.keys returns all the properties of an object, so it works nicely for returning all the values from dictionary styled objects.

You also mentioned a hashmap in your question, the above definition is for a dictionary style interface. Therefore the keys will be unique, but the values will not.

You could use it like a hashset by just assigning the same value to the key and its value.

if you wanted the keys to be unique and with potentially different values, then you just have to check if the key exists on the object before adding to it.

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

or you could build your own class to act as a hashset of sorts.

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