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