typescript - 打字稿:对象可能是“未定义”,但仅适用于“<”和“>”运算符
问题描述
我一直有一个非常奇怪的Object is possibly 'undefined'
错误。我的目标是这样的条件:
if (productPages?.length && productPages[productPages.length - 1].docs?.length < 10){...}
但是这种情况productPages[productPages.length - 1].docs?.length < 10
导致了我的错误Object is possibly 'undefined'
。
问题是,如果我将<
运算符更改为另一个,==
或者===
错误消失,这对我来说似乎很奇怪。
我不想使用! - Non-null assertion operator
,但我找不到任何其他解决方案。
测试的 Typescript 版本:3.7.3 和 4.0.5。
解决方案
整个左侧将评估undefined
是否可选链接失败。在这种情况下,您的代码如下:
if (undefined < 10)
这没有意义,因此 TypeScript 引发了错误。
使用===
不是问题,因为检查一个值是否为to===
并不是没有意义的。undefined
如果docs
肯定存在,则从中删除可选链:.docs.length
. 但是由于您不知道是否productPages[productPages.length - 1]
存在,因此您还需要一个可选链。(你?.
可能在错误的地方。)
如果您不知道是否docs
存在,您需要弄清楚您想要的逻辑:如果找不到嵌套数组,您是要运行代码,还是只想运行代码如果找到嵌套数组?更改为:
const length = productPages[productPages.length - 1]?.docs?.length;
if (length !== undefined && length < 10) {
// or
// if (length === undefined || length < 10) {
取决于你想要的逻辑。
推荐阅读
- php - 在单行中获取数据(键 - 值)
- qt - 如何通过索引 QML 为网格布局上的 1 项设置颜色?
- javascript - 计算多个异步回调的总和
- java - 在 JSP 中根据从数据库中选择的值更改表
- google-apps-script - 类 ColumnChartBuilder 示例不起作用
- r - 如何插入过去的值来代替缺失的月份值?
- jbpm - 由于 H2 db 错误,默认业务应用程序无法正常工作
- .net - 外部项目引用不会复制到输出目录
- php - Laravel 基于 if 语句的更新
- django - 使用 Django、GraphQL、Apollo 和 VueJS 进行 URL 管理