Хэш-карта TypeScript / интерфейс словаря

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

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

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

2 ответа

Решение

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

let myhash: IHash = {};   

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

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

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

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

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

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

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

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

let key = new Object();

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

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

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

Самый простой и правильный способ - использовать тип записи Record

const myVar : Record<string, string> = {
   key1: 'val1',
   key2: 'val2',
}
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 возвращает все свойства объекта, поэтому он прекрасно работает для возврата всех значений из объектов в стиле словаря.

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

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

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

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();
  }
}
Другие вопросы по тегам