Определить хеш-функцию для класса typescript для использования в качестве ключа в словаре / карте

#typescript

#typescript

Вопрос:

Каков идиоматический способ использования объекта класса в ключах словаря в Typescript?

Например, я хотел бы, чтобы Point класс был определен как таковой:

 class Point {
    x: number;
    y: number;
}
 

… и затем сможете использовать Point объект как ключ словаря как таковой:

 let map: Map<Point, number> = new Map();
 

Это выше не будет работать, поскольку Point сравнивается по ссылке. Например,

 map.add(new Point(0, 1), 1);
map.add(new Point(0, 1), 2);
console.log(map);
 

… will дает нам:

 Map(2) {
  Point { x: 0, y: 1 } => 1,
  Point { x: 0, y: 1 } => 2 
}
 

Комментарии:

1. Вам нужно определить свою собственную карту (вы можете расширить собственную), которая перегружает set() и get() использует ваш хэш. Это не совсем идиоматично, но это лучшее, что у нас есть на данный момент.

Ответ №1:

Может быть, что-то вроде этого?

 class Point {
    x: number;
    y: number;

    constructor(x: number, y: number) {
      this.x = x;
      this.y = y;
    }

    hash() {
        return `${this.x},${this.y}`
    }

    static _(x: number, y: number) {
        return new Point(x, y).hash();
    }
}

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

map.set(Point._(0, 1), 1);
map.set(Point._(0, 1), 2);
console.log(map);
 

Или вы можете расширить Map и переопределить set функцию

Игровая площадка Typescript.