如何解决错误“ TS2532:对象可能为“未定义”?

时间:2019-02-26 11:27:41

标签: typescript firebase google-cloud-firestore google-cloud-functions

我正在尝试重建一个使用Firebase Cloud Functions和Firestore的Web应用程序示例。部署功能时,出现以下错误:

src/index.ts:45:18 - error TS2532: Object is possibly 'undefined'.
45     const data = change.after.data();

这是功能:

export const archiveChat = functions.firestore
  .document("chats/{chatId}")
  .onUpdate(change => {
    const data = change.after.data();

    const maxLen = 100;
    const msgLen = data.messages.length;
    const charLen = JSON.stringify(data).length;

    const batch = db.batch();

    if (charLen >= 10000 || msgLen >= maxLen) {

      // Always delete at least 1 message
      const deleteCount = msgLen - maxLen <= 0 ? 1 : msgLen - maxLen
      data.messages.splice(0, deleteCount);

      const ref = db.collection("chats").doc(change.after.id);

      batch.set(ref, data, { merge: true });

      return batch.commit();
    } else {
      return null;
    }
  });

我只是试图部署该功能以对其进行测试。并且已经在网上搜索了类似的问题,但是找不到与我的问题匹配的其他帖子。

3 个答案:

答案 0 :(得分:9)

打字稿说change可能是dataundefined(取决于onUpdate返回的内容)。

因此,您应该将其包装在空/未定义的支票上

if(change && change.after && change.after.data){
    const data = change.after.data();

    const maxLen = 100;
    const msgLen = data.messages.length;
    const charLen = JSON.stringify(data).length;

    const batch = db.batch();

    if (charLen >= 10000 || msgLen >= maxLen) {

      // Always delete at least 1 message
      const deleteCount = msgLen - maxLen <= 0 ? 1 : msgLen - maxLen
      data.messages.splice(0, deleteCount);

      const ref = db.collection("chats").doc(change.after.id);

      batch.set(ref, data, { merge: true });

      return batch.commit();
    } else {
      return null;
    }
}

如果您100%确定总是定义object,则可以输入以下内容:

const data = change.after!.data();

答案 1 :(得分:3)

自2019年10月起,TypeScript 3.7(Beta)上现在提供了可选的链接(?操作符)。您可以通过运行以下命令来安装该版本:

npm install typescript@beta

这样,您可以将表达式简化为以下内容:

const data = change?.after?.data();

您可能会从release notes中了解到更多信息,其中涵盖了该版本上发布的其他有趣功能。

更新(截至2019年11月)

TypeScript的可选链接现已正式可用。安装最新版本的打字稿应该可以访问一些很酷的新功能。

npm install typescript

话虽如此,在处理nullundefined值时,Optional Chaining可以与Nullish Coalescing一起使用以提供备用值

const data = change?.after?.data() ?? someOtherData();

答案 2 :(得分:1)

对于面临与我类似问题的其他人,如果您知道特定对象属性不能为空,则可以在相关项目后使用非空断言运算符 (!)。 这是我的代码:

  const naciStatus = dataToSend.naci?.statusNACI;
  if (typeof naciStatus != "undefined") {
    switch (naciStatus) {
      case "AP":
        dataToSend.naci.certificateStatus = "FALSE";
        break;
      case "AS":
      case "WR":
        dataToSend.naci.certificateStatus = "TRUE";
        break;
      default:
        dataToSend.naci.certificateStatus = "";
    }
  }

并且由于 dataToSend.naci 不能在 switch 语句中未定义,因此可以更新代码以包含感叹号,如下所示:

  const naciStatus = dataToSend.naci?.statusNACI;
  if (typeof naciStatus != "undefined") {
    switch (naciStatus) {
      case "AP":
        dataToSend.naci!.certificateStatus = "FALSE";
        break;
      case "AS":
      case "WR":
        dataToSend.naci!.certificateStatus = "TRUE";
        break;
      default:
        dataToSend.naci!.certificateStatus = "";
    }
  }
相关问题