使用类实例作为 Typescript 映射中的键

jhe*_*l17 6 dictionary typescript

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

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

}
Run Code Online (Sandbox Code Playgroud)

我想使用此类的实例作为映射中的键,如下所示:

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'
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 7

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

你不能。Map是 TypeScript 从 JavaScript 获得的东西。JavaScript 规范说Map使用该SameValueZero操作来确定键是否彼此相等。对于对象实例,那就是===. 也就是说,只有同一个实例与其自身相等,而不是等值实例。它不像 Java 的集合那样遵循对象方法。

没有内置的类似映射的结构可以让您确定键相等性。您可以构建一个,但默认情况下没有一个。