即使我检查对象是否存在条件也可能未定义对象

时间:2020-02-22 21:21:38

标签: typescript firebase google-cloud-functions

我正在尝试为Firebase编写打字稿云功能。即使我检查change.after是否存在here所提到的内容,我仍然会得到对象可能未定义的错误。

这是我的代码:

export const toDashboardInfo = functions.firestore.document('maps/{mapId}').onWrite((change, context) => {  
  let userId;
  if(change.after){
    const after=change.after.data();
    userId=after.ownerId;
  }

这是vscode中的屏幕截图: enter image description here

我在做什么错?谢谢!

1 个答案:

答案 0 :(得分:4)

如前所述,您正在检查change.after是否存在。完成后,您将在其上调用一个名为data()的方法,该方法可以返回FirebaseFirestore.DocumentDataundefined。这意味着变量after可以是这些类型中的任何一种,因为data()方法的结果可能返回了undefined

您还应该在访问typeof after !== 'undefined'的属性之前对其进行检查。

export const toDashboardInfo = functions.firestore.document('maps/{mapId}').onWrite((change, context) => {  
  let userId;
  if (change.after) {
    // change after exists
    const after = change.after.data();

    // after can be undefined as data() could return undefined
    if (typeof after !== 'undefined') {
      userId = after.ownerId; // it's safe to access ownerId
    }
  }
}

此外,如果您使用的是打字稿v3.7及更高版本,则可以使用Optional chaining。该代码将类似于:

export const toDashboardInfo = functions.firestore.document('maps/{mapId}').onWrite((change, context) => {  
  const after = change.after?.data();
  const userId = after?.ownerId || 'default value';
}

如果没有数据或返回|| 'default value'userId可以为undefined,则可以跳过ownerId部分。