小编典典

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

all

我正在尝试重建一个使用 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;
    }
  });

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


阅读 68

收藏
2022-06-21

共1个答案

小编典典

随着 TypeScript 3.7 的发布,可选链(?操作符)现在正式可用。

因此,您可以将表达式简化为以下内容:

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

您可以从该版本的发行说明中了解更多相关信息,其中涵盖了该版本发布的其他有趣功能。

运行以下命令来安装最新的稳定版 TypeScript。

npm install typescript

话虽如此,可选链接可以与空值合并一起使用,以在处理null或值时提供后备undefined

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

附加点:

如果您在条件if语句中使用可选链接,您仍然需要确保您正在执行正确的值/类型相等检查。

以下将在严格的 TypeScript 中失败,因为您可能正在将未定义的值与数字进行比较。

if (_?.childs?.length > 0)

相反,这是你应该做的:

if (_?.childs && _.childs.length > 0)
2022-06-21