【问题标题】:Using class instances as keys in a Typescript Map使用类实例作为 Typescript Map 中的键
【发布时间】:2020-07-13 08:12:04
【问题描述】:

当获取和设置地图值时,地图必须以某种方式知道键是否等于另一个已设置的键。

如何在 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'

【问题讨论】:

    标签: typescript dictionary


    【解决方案1】:

    如何在 Typescript 中实现复杂数据类型(自定义类)的相等性?

    你不能。 Map 是 TypeScript 从 JavaScript 中获得的。 JavaScript 规范说Map 使用SameValueZero operation 来确定键是否彼此相等。对于对象实例,即===。也就是说,只有 同一个实例 等于它自己,而不是等价的实例。它不像 Java 的集合那样遵循对象方法。

    没有内置的类似地图的结构可以让您确定密钥是否相等。您可以构建一个,但默认情况下没有一个。

    【讨论】:

      猜你喜欢
      • 2018-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      • 2021-11-15
      相关资源
      最近更新 更多