【问题标题】:Typescript strictNullChecks error when not possibleTypescript strictNullChecks 错误时不可能
【发布时间】:2019-04-02 02:23:05
【问题描述】:

我正在尝试为我的项目打开 strictNullChecks 设置,但在以下 sn-p 代码中有一个相当奇怪的错误:

toasters.forEach((toster: ToasterObject) => {
  if (toaster.brandName) {
    //This line works just fine
    let y = toaster.brandName.toLowerCase() === 'test brand name';

    //This line has the error
    if (!itemsArray.some(item => item.brandName.toLowerCase() === toaster.brandName.toLowerCase())) {
        //do stuff
    }
  }
});

错误消息在 if 语句中带有下划线 toaster.brandName 并带有以下错误文本:error TS2532: Object is possibly 'undefined'. 如果对象可以在上面的 y = 行上使用,为什么在 if 语句中使用会出现问题?我该如何解决这个问题,这样它就不会出错了?

【问题讨论】:

    标签: typescript strictnullchecks


    【解决方案1】:

    控制流分析是hard。这里的问题是编译器不知道是否或何时或如何调用回调。因此,toaster.brandName 从(大概)string | undefinedstring 的缩小在 array.some() 回调中不再有效。如果您想帮助编译器,您应该将已知定义的 toaster.brandName 值分配给 const,编译器希望它始终保持相同的窄类型:

    toasters.forEach((toster: ToasterObject) => {
      if (toaster.brandName) {
        const toasterBrandName = toaster.brandName; // string, now and forever
    
        if (!itemsArray.some(item => item.brandName.toLowerCase() === toasterBrandName.toLowerCase())) {
            //do stuff
        }
      }
    });
    

    希望有所帮助;祝你好运!

    【讨论】:

    • 非常感谢。这让我得到了正确的答案(上面的 sn-p 中的代码在分享之前必须稍微修改一下)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 2017-01-04
    • 2020-11-16
    • 2017-02-15
    • 1970-01-01
    相关资源
    最近更新 更多