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

标签 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
}

我想使用解构映射到另一种类型,其中 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
}

我该怎么做?

另外,请注意“地址”属性是一个嵌套对象。有没有一种聪明的方法可以通过解构和/或传播来做到这一点?

最佳答案

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

你可以这样做:

export function mapContractTemplate(p: IEntityPerson): IRenamed {
    const { person_id, address, ...rest } = p;
    return {
        personId: person_id,
        address: { ...address },
        ...rest
    }
}

这也会创建地址字段的副本,但不会创建它的深拷贝。因此,如果 address 包含更多嵌套对象或数组,您将不得不手动执行嵌套解构。

关于typescript - 使用解构/扩展在 TypeScript 中复制具有重命名属性的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49006027/

相关文章:

javascript - 将对象解构为数组

json - typescript/angularJs 2 中的类型 'name' 不存在属性 'JSON'

casting - TypeScript 或 JavaScript 类型转换

JavaScript promise : Deep nested context with bind(this)

unit-testing - 如何在每个测试中以不同的方式模拟克隆的导入依赖项

javascript - 如何根据动态定义的变量解构对象

typescript - 在不扩大的情况下推断通用类型

typescript - 使用vuex时如何在typescript语法中使用mapState函数?

javascript - 无法在 react 中使用 setinterval() 附加数组(状态元素)

javascript - 在 React 中解构状态/ Prop