TypeScript интерфейс hashmap/dictionary

Я новичок в использовании TypeScript, и я пытаюсь реализовать интерфейс hashmap/dictionary. До сих пор я

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

У меня возникли проблемы с пониманием того, что именно означает этот синтаксис. Если бы я должен был сделать var x : IHash = {};, как бы я хотел добавить/получить доступ к данным?

Ответы

Ответ 1

Как обычный объект js:

let myhash: IHash = {};   

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

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

Есть две вещи, которые вы делаете с [indexer: string]: string

  • сообщить TypeScript, что объект может иметь любой строковый ключ
  • что для всех ключевых записей значение ДОЛЖНО быть строковым типом.

enter image description here

Вы можете создать общий словарь с явно типизированными полями, используя [key: string]: any;

enter image description here

например, age должен быть number, а name должно быть строкой - оба обязательны. Любое неявное поле может быть любого типа значения.

В качестве альтернативы есть класс Map:

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

let key = new Object();

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

Это позволяет использовать любой экземпляр объекта (не только число/строку) в качестве ключа.

Хотя он относительно новый, поэтому вам, возможно, придется заполнить его, если вы нацелены на старые системы.

Ответ 2

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

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

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

Если вы хотите повторить итерацию через словарь, вы можете использовать.

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

Object.keys возвращает все свойства объекта, поэтому он отлично работает для возврата всех значений из объектов в стиле словаря.

Вы также упомянули хэш-карту в своем вопросе, приведенное выше определение предназначено для интерфейса стиля словаря. Поэтому ключи будут уникальными, но значения не будут.

Вы можете использовать его как hashset, просто присваивая такое же значение ключу и его значению.

если вы хотите, чтобы ключи были уникальными и с потенциально разными значениями, вам просто нужно проверить, существует ли ключ на объекте до его добавления.

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

или вы можете создать свой собственный класс, чтобы действовать как хэш-тип.

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