【问题标题】:Using Map.get() method in typescript, returns undefined, while I am handling undefined在打字稿中使用 Map.get() 方法,返回未定义,而我正在处理未定义
【发布时间】:2020-09-26 20:03:12
【问题描述】:

我正在尝试将重复的字母映射到哈希图中,然后返回字符串中的第一个非重复字符。以下是我为此编写的函数:

export const firstNonRepeatedFinder = (aString: string): string | null => {
  const lettersMap: Map<string, number> = new Map<string, number>();

  for (let letter of aString) {
    if (!lettersMap.has(letter)) {
      lettersMap.set(letter, 1);
    } else {
      incrementLetterCount(letter, lettersMap);
    }
  }

  for (let letter of aString) {
    if (lettersMap.get(letter) === 1) return letter;
  }

  return null;

  function incrementLetterCount(
    aLetter: string,
    aLettersHashMap: Map<string, number>
  ): void {
    if (
      aLettersHashMap.has(aLetter) &&
      aLettersHashMap.get(aLetter) !== undefined
    ) {
      aLettersHashMap.set(aLetter, aLettersHashMap.get(aLetter) + 1);
    }
  }
};

但是,在incrementLetterCount 函数中,虽然我正在处理排除undefined 值以在哈希图中获取key,但它仍然抱怨Object is possibly 'undefined',这意味着get 方法可能返回未定义,我无法继续。

有谁知道我在这里遗漏了什么导致此错误?

【问题讨论】:

  • 这很奇怪,但if (aLettersHashMap.has(aLetter) &amp;&amp; aLettersHashMap.get(aLetter)) 有效吗?只是测试它的真实性。
  • 然后,您似乎也错过了应该进行初始化的 else { aLettersHashMap.set(aLetter, 1); } 案例。
  • @cs95 是的,if (aLettersHashMap.has(aLetter) &amp;&amp; aLettersHashMap.get(aLetter)) 是真的。我不确定我是否完全理解第二条评论。但是你的意思是在 else 语句中我应该实例化{ aLettersHashMap.set(aLetter, 1); } 吗?更多细节:else { lettersMap.set(letter, 1); incrementLetterCount(letter, lettersMap); } 如果是这样,这将始终默认aLetter 计数器为 1
  • @cs95 只是另一个更新:即使 aLettersHashMap.get(aLetter) 的值是 1,当我在递增循环中 console.log() 时,在递增它之前,这意味着它们已被实例化

标签: javascript typescript hashmap


【解决方案1】:

我找到了以下问题的解决方案,但仍然不确定为什么原始代码 sn-p 会引发编译时错误(尽管代码正在检查 undefined 值)。

似乎在 Typescript 中我们可以断言操作数不是null/undefined(来自here)。

新的! 后缀表达式运算符可用于在类型检查器无法得出该事实的上下文中断言其操作数为非空且非未定义。具体来说,操作 x!产生一个 x 类型的值,排除 null 和 undefined。

  function incrementLetterCount(
    aLetter: string,
    aLettersHashMap: Map<string, number>
  ): void {
      aLettersHashMap.set(aLetter, aLettersHashMap.get(aLetter)! + 1);
  }

【讨论】:

    【解决方案2】:

    另一个原因是 tsconfig.json 可能有以下设置

    "strict": true, /* 启用所有严格的类型检查选项。 */

    如果您取出线路,错误应该会消失。

    【讨论】:

      猜你喜欢
      • 2019-09-08
      • 2017-09-19
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      • 2016-11-06
      • 2016-04-13
      相关资源
      最近更新 更多