使用破坏性/扩展来复制Typescript中具有重命名属性的对象



我需要一个将对象从一种类型映射到另一种类型的函数:

我有这样的对象:

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
}

最新更新