我需要一个将对象从一种类型映射到另一种类型的函数:
我有一个这样的对象:
interface IEntityPerson {
person_id: number
name: string
age: number
address: IAddress
}
const orig: IEntityPerson = {
person_id: 1,
name: 'Ole',
age: 40,
address: myAddress
}
我想使用destructuring映射到person_id重命名为personId的另一种类型:
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
}
我该怎么做?
另外,请注意'地址' property是一个嵌套对象。有没有一种聪明的方法来解决和/或传播?
答案 0 :(得分:1)
对对象进行解构已经将结构化属性定义为作用于该块的字段,不能将它们作为一个组分配给另一个字段。
你可以这样做:
export function mapContractTemplate(p: IEntityPerson): IRenamed {
const { person_id, address, ...rest } = p;
return {
personId: person_id,
address: { ...address },
...rest
}
}
这也将创建地址字段的副本,但不会创建它的深层副本。因此,如果address
包含更多嵌套对象或数组,则必须手动执行嵌套解构。
答案 1 :(得分:0)
也许您可以简单地将所有属性复制到新对象并应用这样的特定差异:
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;
}
此代码保留相同的地址实例。我不清楚你是否也需要克隆这个对象。
答案 2 :(得分:0)
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
}