首页 > 解决方案 > 如何从 TypeScript 中的地图中的自定义键类型中获取对象?

问题描述

我有一个名为的自定义类Foo

class Foo {
    constructor(public v: any) {
    }
}

我有一张地图,Foo我的钥匙在哪里:

const map = new Map<Foo, string>();

AFAIK TypeScript 没有比较重载。如何确保获取密钥正常工作?

const foo = new Foo(1234);
map.get(foo);

这是整个代码:

class Foo {
    constructor(public v: any) {

    }
}

const map = new Map<Foo, string>();


const foo = new Foo(1234);
map.set(foo, "HELLO WORLD");

const foo2 = new Foo(1234);
console.log(map.get(foo2)); // DOESN'T work

console.log(map.get(foo)); // DOES work of course

You can find my problem here: https://www.typescriptlang.org/play?#code/MYGwhgzhAEBiD29oG8BQ0PWPAdhALgE4Cuw+8hAFAA7EBGIAlsNAG4Bc0YOAngJQpU6TAF9UYodjz5oAWzDVoAXmg4ApgHdoAWQUAeBPAA00AoUY4A5gD5KfANxDUUgtABmiZas1xElAIwATADMACwOqPLUAHQQaviUHsbQAEQAEgCiADJZAPLQAOq5AEpZACIpEZK4rkmBXupahgEh4Y4u8CBq0SDwlpRR0ZbxiYiBfA7QAPRT0AAm8GoQOADkMhoUANZOHV09fQMKQyNJE-bTs2W5GQDK0BuE26hAA

标签: javascripttypescript

解决方案


您遇到的问题与 TypeScript 无关,而是与 JavaScript 没有引用透明度有关。因此,这样的比较new Foo(123) === new Foo(123)总是虚假的。

解决方案

JavaScript 的Mapapi 相当有限。如果您想使用自定义比较函数(在这种情况下按值比较)查找特定条目,我建议使用.entries() 方法Map从tuples 数组的形式中获取所有条目[key, value][]。然后,您可以在那里找到您想要使用的任何条目Array.find()Map本身没有这样的方法。

但是,更好的方法是重新考虑您的数据结构。考虑到 的限制,Map最好将原始数据类型作为Map. 由于我不知道你的具体情况,我只能提供这个一般性建议。


推荐阅读