即使使用 `?` 链接或条件检查,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<T>
(因为我只从查询返回的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(无链接或复制文件)