对象的可选添加的简单符号?
我有一个服务,其中包含一些可选输入,这些输入根据调用服务的形式传入。如果我尝试在没有 sid 和 eid 输入的情况下运行它,则实际的 .add({}) 到 firestore 会出现有关字段未定义的错误,这是有道理的。
Unsupported field value: undefined (found in field eventId in document
所以,我可以想到使用各种表达式和 if 语句的几种方法,或者在可以从不同位置调用的服务上编写 2 种不同的变体,但我希望有一个更优雅的解决方案。
有没有一种简单的方法,比如“?”,你可以在接口或输入中使用来指示该字段是可选的?
比如:{...inventoryAdd,...timestamp,...?sessionId,...?eventId
或者,我只需要编写一些逻辑,或者将函数分成两个?
addInventory(inventoryAdd: any, pid: string, sid?: string, eid?: any) {
const inventoryCollectionRef = this.afs.collection("/Party-Management/" + pid + "/Party-Inventory");
const timestamp = { timestamp: firebase.firestore.FieldValue.serverTimestamp() }
const sessionId = { sessionId: sid}
const eventId = { eventId: eid }
inventoryCollectionRef.add({ ...inventoryAdd, ...timestamp, ...sessionId, ...eventId })
}
我可能只会使用
if
语句(但请继续阅读):
addInventory(inventoryAdd: any, pid: string, sid?: string, eid?: any) {
const inventoryCollectionRef = this.afs.collection("/Party-Management/" + pid + "/Party-Inventory");
const toAdd = {
...inventoryAdd,
timestamp: firebase.firestore.FieldValue.serverTimestamp(),
};
if (sid) {
toAdd.sessionId = sid;
}
if (eid) {
toAdd.eventId = eid;
}
inventoryCollectionRef.add(toAdd);
}
但是如果您想用表达式来执行此操作,则传播
null
是一个无操作,因此当您没有
sid
/
eid
时,您可以将
sessionId
/
eventId
设置为
null
(请参阅
***
):
addInventory(inventoryAdd: any, pid: string, sid?: string, eid?: any) {
const inventoryCollectionRef = this.afs.collection("/Party-Management/" + pid + "/Party-Inventory");
const timestamp = { timestamp: firebase.firestore.FieldValue.serverTimestamp() };
const sessionId = sid ? { sessionId: sid} : null; // ***
const eventId = eid ? { eventId: eid } : null; // ***
inventoryCollectionRef.add({ ...inventoryAdd, ...timestamp, ...sessionId, ...eventId });
}
传播
undefined
也是一个无操作,就像传播一个空字符串一样,因此您也可以这样做(请参阅
***
):
addInventory(inventoryAdd: any, pid: string, sid?: string, eid?: any) {
const inventoryCollectionRef = this.afs.collection("/Party-Management/" + pid + "/Party-Inventory");
const timestamp = { timestamp: firebase.firestore.FieldValue.serverTimestamp() };
const sessionId = sid && { sessionId: sid}; // ***
const eventId = eid && { eventId: eid }; // ***
inventoryCollectionRef.add({ ...inventoryAdd, ...timestamp, ...sessionId, ...eventId });
}
这有效,因为
x && y
评估
x
,如果
x
为
falsy
,则取该值作为结果,否则评估
y
并将其作为结果。因此,如果
sid
/
eid
为
undefined
或
""
,则
sessionId
/
eventId
为
undefined
或
""
(并且展开它们不会在对象中放置任何内容);否则,它们就是对象,展开它们会将其属性添加到对象中。