Интерфейс хэш-карты / словаря TypeScript


99

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

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

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

Ответы:


138

Как обычный объект 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"

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

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


1
«если явно не указано иное» - и как это можно сформулировать? AFAIK, любое поле, указанное явно, должно соответствовать подписи индекса.
— Cerberus

да ... ты совершенно прав. либо я перепутал это с вводом, anyлибо они изменили это поведение. Я готов поспорить на первое. Спасибо. :)
— Мейрион Хьюз

10

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

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

8
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();
  }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.