首页 > 解决方案 > 对象可能为空。打字稿错误

问题描述

如何修复 ESLint 错误:“对象可能为空”?在我的代码中,我正在检查 null,但无论如何都有错误

if (controlInput !== null) {
  if (controlInput.match(/[$;.,'"-=!@#$%^&*()]/g).length !== 0) {
    return 'some message'
  }
}

标签: typescripteslint

解决方案


错误消息不是关于,controlInput而是关于返回的值controlInput.match()

如果Array的值controlInput与正则表达式匹配或null不匹配,则为。

常见的解决方案是将返回的值提取controlInput.match()到变量中,然后仅在不是时才使用它null

if (controlInput !== null) {
  const matches = controlInput.match(/[$;.,'"-=!@#$%^&*()]/g);
  if (matches && matches.length) {
    return 'some message';
  }
}

但是,如果您不关心匹配的子字符串,而仅当字符串与正则表达式匹配时,您可以直接检查返回的值controInput.match()

if (controlInput !== null && controlInput.match(/[$;.,'"-=!@#$%^&*()]/g)) {
  return 'some message';
}

或者,更好的是,使用RegExp.test(). 它更快。

if (controlInput !== null && /[$;.,'"-=!@#$%^&*()]/.test(controlInput)) {
  return 'some message';
}

关于正则表达式的一些想法

显然您想检查 的值是否controlInput包含一些特殊字符。

regexp中,表达式[...]称为“字符集”,它匹配方括号之间指定的字符列表中的一个字符。

大多数字符在字符集中表示自己。但是,字符集中有两个特殊字符。其中一个是^但仅当它是字符集中的第一个字符(紧跟在 之后[)。它否定了字符集的含义。

另一个特殊字符是-,当它不是字符集中的第一个或最后一个字符时。[a-z]不是指“一个a-z”,而是“介于和之间的任何字符az,即任何小写字母。

正则表达式中的字符类包含字符集中匹配ASCII 代码"-=之间以及包括"=中的所有字符的片段。此子集包括、和您已包含在字符集中的其他字符。.,;

这就是为什么我认为您的意图不是包括之间的所有字符",而=仅包括字符"和。-=

为了获得预期的行为(-代表自己)-在集合的开头或结尾移动。

if (controlInput !== null && /[-$;.,'"=!@#$%^&*()]/.test(controlInput)) {
  return 'some message';
}

推荐阅读