打字稿:对象可能是“未定义”,但仅适用于“<”和“>”运算符

Ped*_*ein 2 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,但我找不到任何其他解决方案。

测试的打字稿版本:3.7.3 和 4.0.5。

Cer*_*nce 5

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

if (undefined < 10)
Run Code Online (Sandbox Code Playgroud)

这没有意义,所以 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) {
Run Code Online (Sandbox Code Playgroud)

取决于你想要的逻辑。

  • `undefined &lt; 10` 实际上_有意义_:它在 JS 中是 `false`,这非常有用。 (3认同)