我想优雅地复制一个打字稿结构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
答案 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 type。 Map
基于身份(内存中相同的对象)而不是任何类型的“相同属性”相等来使用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)
之类的预期密钥,然后再将其放入地图或查找。
无论如何,希望能有所帮助。祝你好运。