繁体   English   中英

在TypeScript中使用解构/扩展来复制具有重命名属性的对象

[英]Using destructuring/spreading to copy object with renamed properties in 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重命名为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
}

我怎样才能做到这一点?

另外,请注意,“ address”属性是一个嵌套对象。 是否有一种聪明的方法来进行销毁和/或扩散?

解构对象已经将解构的属性定义为范围限定于该块的字段,不能将它们作为组分配给另一个字段。

您可以这样做:

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 } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM