使用解构/传播来复制具有TypeScript

时间:2018-02-27 10:07:20

标签: typescript ecmascript-6 destructuring spread-syntax

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

我有一个这样的对象:

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是一个嵌套对象。有没有一种聪明的方法来解决和/或传播?

3 个答案:

答案 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
}