#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
функцию