Хэш-карта 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();
}
}