开发者问题收集

对象的可选添加的简单符号?

2022-05-27
51

我有一个服务,其中包含一些可选输入,这些输入根据调用服务的形式传入。如果我尝试在没有 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 })
  }
1个回答

我可能只会使用 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 / eidundefined"" ,则 sessionId / eventIdundefined"" (并且展开它们不会在对象中放置任何内容);否则,它们就是对象,展开它们会将其属性添加到对象中。

T.J. Crowder
2022-05-27