typescript - 如何解决错误“TS2532:对象可能是“未定义”?
问题描述
我正在尝试重建一个使用 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;
}
});
我只是试图部署该功能来测试它。并且已经在网上搜索了类似的问题,但找不到与我的问题匹配的任何其他帖子。
解决方案
随着 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)
推荐阅读
- swift - 为什么预处理器可以忽略“-Wobjc-literal-conversion”?
- jsf - 是否可以从后台进程访问 JSF ApplicationScoped bean?
- go - 位桶管道中的 Go mod dep 错误
- php - 本地 wordpress 安装的 Frontity Api 连接问题
- r - R中的`webshot`抛出“我是`fs`模块幻影错误:TypeError:未定义不是构造函数”
- javascript - 为 javascript 视频播放器解析 m3u8
- python - 计算并减去不是今天的日期的特定时间
- javascript - 从 API 解析后更改值
- list - Tkinter 组合框再次循环。得到结果
- python - 尝试根据用户输入在网格中制作多个动态字计数器