在打字稿中使用 Map.get() 方法,返回未定义,而我正在处理未定义

Ami*_*lar 5 javascript hashmap typescript

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

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);
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

然而,在incrementLetterCount, 函数中,尽管我正在处理排除在哈希图中undefined获取 a 的值key,但它仍然抱怨Object is possibly 'undefined'这意味着该get方法可能返回未定义,并且我无法继续执行它。

有谁知道我在这里缺少什么导致这个错误?

Ami*_*lar 8

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

看来在 Typescript 中我们可以断言操作数不是null/undefined(从这里)。

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

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