网站搜索

typescript - 如何从对象副本中删除属性?


例如,如果我有一个看起来像这样的对象:

const rabbit = {
  color: 'blue',
  personalData: {
    name: 'Bob',
    age: 35
  }
}

然后我使用展开运算符复制它,然后尝试删除一个字段:

const rabbitCopy = {
  ...rabbit
}
delete rabbitCopy.personalData.name

我如何避免出现消息:"delete 运算符的操作数必须是可选的。" 我理解为什么会出现此消息,因为对于 TypeScript 来说,让用户删除一个属性是不合理的,这会破坏契约......但在我的情况下,我需要这样做

我如何在复制对象的那一刻,为副本定义可选组件?

我见过的处理这种情况的唯一方法如下,但我不太明白到底发生了什么:

delete (rabbitCopy.personalData as unknown as Record<string, unknown>).name

答案#1

由于没有显式类型,Typescript 会推断 rabbit 的类型:

你可以这样告诉 Typescript,name 是一个可选属性:

type Rabbit = {
  color: string;
  personalData: {
    name?: string;
    age: number;
  }
}

const rabbit: Rabbit = {
  color: 'blue',
  personalData: {
    name: 'Bob',
    age: 35
  }
}

然后这将不会导致任何错误:

const rabbitCopy = {
  ...rabbit
}
delete rabbitCopy.personalData.name

在这里试试

答案#2

在类型和副本中将名称字段设为可选,

注意:当你删除它时,它也会从 rabbit 对象中删除,解构仅创建一个浅拷贝。

type Rabbit = {
  color: string
  personalData: {
    name?: string;
    age: number;
  }
}

const rabbit:Rabbit = {
  color: 'blue',
  personalData: {
    name: 'Bob',
    age: 35
  }
}

const { name, ...personalData} = rabbit.personalData;
const copy = {
    ...rabbit,
    personalData
}