地图可以将键作为自定义类型吗?

时间:2019-08-23 11:28:58

标签: typescript typescript2.0

我具有自定义界面类型:

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"}}]

1 个答案:

答案 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' } } ]

credits