TypeScript:复制地图,同时添加键值对

时间:2018-12-31 02:36:11

标签: typescript typescript3.0

我想优雅地复制一个打字稿结构interfaceName(它满足特定的接口)。此TypeScript包含类型attribute3的映射Map<IKey, number>,可能需要修改(取决于条件):(必须插入附加的键值对。)

IKey还是一个接口。

interface InterfaceName{
   attribute1: string
   attribute2: string
   attribute3: Map<IKey, number>

}

interface IKey{
    a1: number
    a2: number
}

}

我的尝试如下:我仅使用...语法复制interfaceName的所有成员,然后尝试为attribute3分配修改后的副本。 但是以某种方式这是行不通的:最后,无论布尔值如何,都将相同的Map对象从函数中传递出去。

const createModifiedCopyIfWished = (interfaceName: InterfaceName, wished: Boolean) => wished ? {
        ...interfaceName,
        attribute3: interfaceName.attribute3.set({a1:1,a2:2},5)
    }
    :
    interfaceName

let a: InterfaceName = {
    attribute1: "a",
    attribute2: "b",
    attribute3: new Map<IKey, number>()
}

let b = createModifiedCopyIfWished(a, true)

// {"attribute1":"a","attribute2":"b","attribute3":{}}
console.log(JSON.stringify(b))

探测器的方法是什么? 在一个陈述中甚至可能吗?

工作示例:LiveCode

1 个答案:

答案 0 :(得分:1)

是的,只有一条语句就可以实现,例如

const createModifiedCopyIfWished = (
  interfaceName: InterfaceName, 
  wished: boolean
) => wished ? {
  ...interfaceName,
  attribute3: new Map(
    [...Array.from(interfaceName.attribute3), [{ a1: 1, a2: 2 }, 123]]
  )
} : interfaceName

这是假设您正在尝试clone地图,而不仅仅是修改现有地图。


被警告,但是IKey可能不是Map的好key typeMap基于身份(内存中相同的对象)而不是任何类型的“相同属性”相等来使用object equality。因此,以下行为将与预期不符:

const map: Map<IKey, number> = new Map();
map.set({ a1: 1, a2: 2 }, 123);
const val = map.get({ a1: 1, a2: 2});
console.log(val); // undefined !

这是因为({a1: 1, a2: 2} === {a1: 1, a2: 2}) false 。除非您非常小心,否则将对象用作映射键是丢失它们的好方法。对象作为映射键的唯一方法是将实际的对象键存储在某个位置,然后在以后使用它们在映射中查找条目。这通常不是人们想要的。

更合理的行为可能只是使用string作为密钥,然后将其转换为JSON.stringify(objectKey)之类的预期密钥,然后再将其放入地图或查找。


无论如何,希望能有所帮助。祝你好运。