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
}
