当前位置: 首页 > 知识库问答 >
问题:

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

梅安平
2023-03-14

我正在尝试重建一个使用Firebase云函数和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个答案

芮建茗
2023-03-14

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

  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 = "";
    }
  }
谯嘉木
2023-03-14

如果您使用的是Typescript 3.7或更新版本,现在还可以执行以下操作:

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

    if(!data) {
      console.error('No data here!');
       return null
    }

    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;
    }

Typescript表示更改数据可能是未定义的(取决于更新返回的内容)。

因此,您应该将其包装在空/未定义的检查中:

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%确定始终定义了对象,则可以将以下内容:

const data = change.after!.data();
宗政洋
2023-03-14

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

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

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

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

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

npm install typescript

也就是说,可选的链接可以与Nulish合并一起使用,以在处理null未定义的值时提供回退值

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

其他要点:

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

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

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

相反,这是您应该做的:

if (_?.childs && _.childs.length > 0) 
 类似资料:
  • 我有一个类型: 我声明一个全局模块变量: 我在范围中指定了适当的值: 稍后在范围中,我调用: 我收到TypeScript错误: 我知道我可以使用if($protected.listle){$protected.listle}进行显式检查,以使编译器平静下来,但对于大多数非平凡的情况来说,这似乎是非常不容易的。 在不禁用TS编译器检查的情况下,如何处理这种情况?

  • 我的职能是: 我在这条线上出错了。 我们需要解决它。请帮忙做。

  • 本文向大家介绍完美解决IE9浏览器出现的对象未定义问题,包括了完美解决IE9浏览器出现的对象未定义问题的使用技巧和注意事项,需要的朋友参考一下 目前Window7的机器上,使用IE9浏览器的用户很多,但是IE9在兼容性上做了较严格的控制,导致很多程序在chrome,firefox,ie6,ie7,ie8上可以正常运行,在ie9上确出现了各种问题,这里要说的其中一个问题,就是对象为定义,特别是单一个

  • 问题内容: 我不明白为什么会收到错误预期[object Undefined] undefined为字符串 这是脚本Java LoginToGmail.java 全栈错误是: 问题答案: 要使用Selenium 3.x,Mozila Firefox 52.x,您需要从此处下载最新的gecko驱动程序,并提供gecko驱动程序的绝对路径,如下所示:

  • 我有一组代码,给我一个,即使这部分代码是正确的,但我不知道为什么,但我错过了一些肯定的东西。 回溯显示我在中有错误,它给了我这个错误消息:

  • 我编写了两个函数,可以有效地复制JSON.stringify(),将一系列值转换为stringify版本。当我将代码移植到JSBin并在一些示例值上运行它时,它运行得很好。但是我在一个专门为测试这个而设计的规范运行程序中遇到了这个错误。 我的代码: 我从测试人员那里得到的错误消息是: 它似乎失败了:例如stringifyJSON(null)