【问题标题】:Typescript: Object is possibly 'undefined' but only for '<' and '>' operators打字稿:对象可能是“未定义”,但仅适用于“<”和“>”运算符
【发布时间】:2021-02-25 18:00:59
【问题描述】:

我遇到了一个非常奇怪的Object is possibly 'undefined' 错误。我的目标是这样的条件:

if (productPages?.length &amp;&amp; productPages[productPages.length - 1].docs?.length &lt; 10){...}

但条件productPages[productPages.length - 1].docs?.length &lt; 10 导致我出现错误Object is possibly 'undefined'

问题是,如果我将 &lt; 运算符更改为另一个运算符,例如 =====,错误就会消失,这对我来说似乎很奇怪。

我不想使用! - Non-null assertion operator,但我找不到任何其他解决方案。

测试的 Typescript 版本:3.7.3 和 4.0.5。

【问题讨论】:

  • 这没什么奇怪的。检查是否等于undefined 是有意义的。检查它是大于还是小于它。
  • 这可能会有所帮助:stackoverflow.com/questions/40349987/…
  • 感谢您的快速回复。

标签: typescript


【解决方案1】:

如果可选链接失败,整个左侧将评估为undefined。在这种情况下,您的代码如下:

if (undefined < 10)

这没有意义,因此 TypeScript 会引发错误。

使用=== 不是问题,因为检查一个值是否是===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) {

取决于你想要的逻辑。

【讨论】:

  • 评论部分应该是||,我猜?
  • 哎呀,是的,当然。
  • 非常感谢,就是这样。
猜你喜欢
  • 2019-07-30
  • 2019-09-15
  • 1970-01-01
  • 2021-01-19
  • 2019-12-24
  • 1970-01-01
  • 2021-08-06
  • 2021-08-24
  • 1970-01-01
相关资源
最近更新 更多