我具有自定义界面类型:
export interface IDictionary {
id: number;
dbVersion: number;
code: string;
tableName: string;
name: Name;
shortName: ShortName;
active: boolean;
restricted: boolean;
hierarchy: boolean;
metadata: string;
rights: any[];
}
然后我尝试构建Map():
dataMap = new Map<IDictionary, IDictionary[]>([
[{ name: { ru: "Root1"}} as IDictionary, [{ name: { ru: "Papa"}} as IDictionary]]
]);
是否可以使用key
作为IDictionary
类型?
然后我尝试通过键获取值:
this.dataMap.get(node);
其中节点是对象:
{ name: { ru: "Root1"}}
我应该得到:[{ name: { ru: "Papa"}}]
答案 0 :(得分:2)
在JavaScript(以及作为扩展名,TypeScript)中,没有两个对象相等,除非它们引用相同的对象。如果创建一个新对象,它将不会认为它等于任何现有对象。
因为地图在查找元素时会考虑这种相等性,所以如果您将一个对象作为键存储一个值,那么只有当您再次将完全相同的对象引用作为键传递时,才可以再次获得该值:
interface Name {
ru: string
}
interface ShortName extends Name {}
interface IDictionary {
id?: number;
dbVersion?: number;
code?: string;
tableName?: string;
name: Name;
shortName?: ShortName;
active?: boolean;
restricted?: boolean;
hierarchy?: boolean;
metadata?: string;
rights?: any[];
}
const node = { name: { ru: 'Root1' } }
const dataMap = new Map<IDictionary, IDictionary[]>([[
node, [{ name: { ru: 'Papa' } }]
]])
console.log(dataMap.get({ name: { ru: 'Root1' } })) // undefined
console.log(dataMap.get(node)) // [ { name: { ru: 'Papa' } } ]