我试着在这里阅读如何从对象中删除属性:How do I remove a property from a JavaScript object?
它应该使用delete
,我这样尝试
const eventData = {...myEvent}; // myEvent is an instance of my `Event` class
delete eventData.coordinate; // I have error in here
但我有这样的错误
“delete”运算符的操作数必须是可选的。ts(2790)
然后我读到这个Typescript does not infer about delete operator and spread operator?
它似乎是通过使用以下命令更改我的tsconfig.json文件来消除该错误的
{
"compilerOptions": {
...
"strictNullChecks": false,
}
...
}
但是如果我实现了这个,我将不再进行空值检查
那么如何在没有'delete'操作符的操作数的情况下从Typescript中的对象中删除属性一定是可选错误?
5条答案
按热度按时间dzjeubhm1#
Typescript会警告你违反契约(对象将不再具有required属性)。一种可能的方法是在克隆对象时忽略该属性:
Playground
delete
的操作数必须是可选的。在strictNullChecks
中使用delete
运算符时,操作数必须是any
、unknown
、never
或可选的(因为它在类型中包含undefined
)。否则,使用delete
运算符是错误的。文件
gg0vcinb2#
如果属性是可选的,则可以删除
mwkjh3gx3#
就我个人而言,我利用泛型创建了一个特定的函数,并且它运行得很好!
两个泛型
O
和A
创造了所有的奇迹,尤其是A
泛型:extends keyof O
表示“第二个参数必须是来自对象的属性”。然后在函数内部,TypeScript确定
attr
是来自object
的属性。我使用attr in newObject
if语句进行了双重检查,以确保在运行时一切正常。这只是纯粹的防御性编程。这里的
const newObject = { ...object }
是为了确保我们不会修改作为arg传递的引用,而是返回一个新的引用,这是我过去函数式编程的一些遗留物。现在我们试试这个函数:
rqmkfv5c4#
这个错误告诉您的是
coordinate
不是该对象的可选属性(也就是说,它可以是未定义的),您正在尝试删除它。如果它是可选的,您可以将其删除
它似乎是在4.0版本之后引入的,你可以在here上阅读更多关于它的信息。
6bc51xsx5#
删除属性的另一种方法: