Использование экземпляров класса в качестве ключей на карте Typescript - PullRequest
3 голосов
/ 13 июля 2020

При получении и установке значений карты карта должна каким-то образом знать, равны ли ключи другому, уже заданному ключу.

Как реализовать равенство для сложных типов данных (настраиваемые классы) в Typescript? В Java я бы переопределил метод equals, есть ли эквивалент в машинописном тексте?

В моем случае у меня есть следующий класс:

export class Path {

    constructor(
        private readonly scope: string[],
        private readonly object: string[],
        private readonly value: string
    ) { }

    getScope(): string[] {
        return this.scope;
    }

    getObject(): string[] {
        return this.object;
    }

    getValue(): string {
        return this.value;
    }

    // @override equals(): boolean    --    ?

}

Я хочу использовать экземпляры этого класса как ключи на карте:

const map = new Map<Path, string>();
map.set(new Path(['hello'], ['world'], 'asdf'), 'hwa');
map.set(new Path(['see', 'you'], ['world'], 'asdf'), 'swa');

map.get(new Path(['hello'], ['world'], 'asdf')); // 'hwa'
map.get(new Path(['see', 'you'], ['world'], 'asdf')); // 'swa'

1 Ответ

3 голосов
/ 13 июля 2020

Как реализовать равенство для сложных типов данных (пользовательских классов) в Typescript?

Вы не можете. Map - это то, что TypeScript получает от JavaScript. В спецификации JavaScript говорится, что Map использует операцию SameValueZero , чтобы определить, равны ли ключи друг другу. Для экземпляров объектов это ===. То есть только тот же экземпляр равен самому себе, а не эквивалентные экземпляры. Он не зависит от объектного метода, такого как коллекции Java.

Нет встроенной структуры, подобной карте, которая позволяет вам определять равенство ключей. Вы можете построить один, но по умолчанию его нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...