对象的可选添加的简单表示法?

Easy Notation for Optional Addition to an Object?

我有一个服务,其中包含一些可选的输入,这些输入取决于调用该服务的表单。如果我尝试 运行 这没有 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 是一个 no-op,所以你可以将 sessionId/eventId 设置为 null 当你没有 sid/eid 时(见 ***):

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 也是一个 no-op,就像传播一个空字符串一样,所以你也可以这样做(参见 ***):

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,如果 xfalsy,则取该值作为结果,否则它计算 y 并取那个作为它的结果。所以如果 sid/eidundefined"", sessionId/eventIdundefined"" (并且传播它们不会在对象中放置任何东西);否则,它们就是对象,展开它们会将它们的属性添加到对象中。