我需要一个将对象从一种类型映射到另一种类型的函数:
我有这样的对象:
interface IEntityPerson {
person_id: number
name: string
age: number
address: IAddress
}
const orig: IEntityPerson = {
person_id: 1,
name: 'Ole',
age: 40,
address: myAddress
}
我想使用破坏性将person_ID重命名为persyid的另一种类型:
interface IRenamed {
personId: number
name: string
age: number
address: IAddress
}
const newObj: IRenamed = {
personId: 1,
name: 'Ole',
age: 40,
address: myAddress
}
我尝试过但不起作用:
export function mapContractTemplate(p: IEntityPerson): IRenamed {
const renamed = {
person_id: personId,
...rest
} = p
return renamed
}
我该怎么做?
另外,请注意"地址"属性是嵌套对象。是否有一种明智的方法可以通过破坏和/或传播?
破坏对象已经将破坏性属性定义为范围内的字段,它们不能被分配为一个组。
您可以这样做:
export function mapContractTemplate(p: IEntityPerson): IRenamed {
const { person_id, address, ...rest } = p;
return {
personId: person_id,
address: { ...address },
...rest
}
}
这也将创建地址字段的副本,但不会创建其深层副本。因此,如果address
包含更多的嵌套对象或数组,则必须手动进行嵌套的破坏。
也许您可以简单地将所有属性复制到一个新对象,并应用这样的特定差异:
export function mapContractTemplate(p: IEntityPerson): IRenamed {
// create a new object and add the new property
const renamed = {
personId: p.person_id
};
// blind copy all properties
for(var key in p) {
renamed[key]=p[key];
}
// delete the unwanted 'old' property
delete renamed.person_id;
return renamed;
}
此代码保留地址的相同实例。我还不清楚您是否还需要克隆此对象。
嗯,没有迪尔塞特在我的知识中破坏它。您能做的是
export function mapContractTemplate(p: IEntityPerson): IRenamed {
const clone = JSON.parse(JSON.stringify(p)) // deep clone the object
clone.personId = clone.person_id
delete clone.person_id;
return clone
}