即使使用 `?` 链接或条件检查,Typescript Partial<T> 也会导致未定义的错误

Posted

技术标签:

【中文标题】即使使用 `?` 链接或条件检查,Typescript Partial<T> 也会导致未定义的错误【英文标题】:Typescript Partial<T> causing undefined error even with `?` chaining or conditional Checks 【发布时间】:2021-05-28 12:41:32 【问题描述】:

我有一个 mongoose 文档存储如下:

const currentGuildAlerts: Partial<mongoose.Document<IServerSchema> | null> = await Server.findOne(query).exec();

使用Partial&lt;T&gt;(因为我只从查询返回的IServerSchema 中获得一条路径),我知道Partial? 链接到界面中每个属性的末尾。但是我应该能够通过对值使用条件检查来解决它吗?

if(currentGuildAlerts) currentGuildAlerts.get("symbol_alerts").btc_alerts;

这仍然给我错误: Cannot invoke an object which is possibly 'undefined'.

我什至尝试过

currentGuildAlerts?.get("symbol_alerts").btc_alerts;

似乎仍然没有解决问题。我在这里做错了什么?

【问题讨论】:

【参考方案1】:

Partial 表示对象的属性可能是undefined。您正在确保 currentGuildAlerts object 不是 null,但您尚未检查 property 是否存在。

您还需要在get 之后使用可选链接?.,因为您已经说过Document 的所有属性都可能是undefined

const currentGuildAlerts: Partial<mongoose.Document<IServerSchema>> | null = await Server.findOne(query).exec();

const alerts = currentGuildAlerts?.get?.("symbol_alerts").btc_alerts;

也许将Partial 移动到Document 中更有意义?

const currentGuildAlerts: mongoose.Document<Partial<IServerSchema>> | null = await Server.findOne(query).exec();

const alerts = currentGuildAlerts?.get("symbol_alerts").btc_alerts;

【讨论】:

以上是关于即使使用 `?` 链接或条件检查,Typescript Partial<T> 也会导致未定义的错误的主要内容,如果未能解决你的问题,请参考以下文章

即使第一个条件为假,是不是所有条件都在 if 语句中进行检查?

CASE WHEN SQL 查询在 else 中执行条件,即使第一个条件为真

Visual Studio:如何使用 IIS Express 和跨项目引用在共享项目中调试 TypeScript(无链接或复制文件)

在 django admin 中有条件地取消注册或注册模型

怎样查看网页上彻底隐藏的元素和文本?

即使设置为 false,使用条件渲染的 React Native 仍然尝试访问状态