【问题标题】:Undefined after a check?检查后未定义?
【发布时间】:2018-10-17 19:21:35
【问题描述】:

在打开 strictNullChecks 的情况下关注 code 时出现错误

对象可能是“未定义”。

class Smth {
    private data: Array<{ value: number} | undefined> = [];

    public doSmth(i: number) { 
        const data = this.data;
        return data[i] && data[i].value === 0
        //                ^^^^^^^ Object is possibly 'undefined'.
    }
}

我无法理解它在检查后如何未定义。

【问题讨论】:

  • Here's the related issue., TL;DR,由于编译器性能成本,打字稿不会检查这个。同时,您可以使用非空断言:data[i]!.value === 0
  • 我建议不要在代码的多个位置使用相同的变量名,虽然可以这样做,但这会使代码混乱。您有一个名为“data”的常量变量,还有一个同名的类的私有成员。问问自己,你真正在代码中使用的是哪一个?
  • @JonnathanQ,但它们指的是同一个对象。
  • @CRice,为什么不回答?
  • @Qwertiy,我认为肯定会有重复的,我打算在评论后投票,但现在我找不到。我现在将其发布为答案。

标签: typescript


【解决方案1】:

这是打字稿中的known issue

TL;DR 对于该问题,Typescript 可以进行这些检查,但开发人员选择不这样做,因为编译器的性能成本很高。

解决方法是使用非空断言运算符 (!) 告诉编译器该值不是 nullundefined。对于这个例子:

return data[i] && data[i]!.value === 0

【讨论】:

  • 另一种方式(不使用非空断言运算符)只是将数组项存储在自己的变量中:const item = this.data[i]; return item &amp;&amp; item.value === 0;
猜你喜欢
  • 1970-01-01
  • 2019-10-19
  • 2013-07-14
  • 2017-04-05
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多