javascript - Ved å bruke Map.get()-metoden i typescript, returneres undefined, selv om jeg håndterer undefined


Jeg prøver å kartlegge gjentakelsen av bokstaver i et hashmap og deretter returnere det første ikke-gjentatte tegnet i en streng. Følgende er funksjonen jeg har skrevet for å gjøre det:

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);
    }
  }
};

Likevel, i incrementLetterCount-funksjonen, selv om jeg håndterer å ekskludere undefined-verdier for å få en key i hashmapen, klager den fortsatt over Object is possibly 'undefined', noe som betyr at get-metoden kan returnere undefined og jeg kan ikke gå videre med det.

Vet noen hva jeg mangler her som resulterer i denne feilen?

Svar #1

Jeg fant følgende løsning på problemet mitt, men er fortsatt ikke sikker på hvorfor den opprinnelige kodebiten ga en kompileringstid-feil (selv om koden sjekket mot undefined-verdier).

Det ser ut til at vi i Typescript kan påstå at operanden ikke er null/undefined (herfra).

En ny ! postfiks-uttrykksoperator kan brukes for å påstå at operandet ikke er null og ikke er udefinert i kontekster der typekontrolløren ikke klarer å konkludere med dette. Spesifikt produserer operasjonen x! en verdi av typen til x med null og udefinert ekskludert.

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

Svar #2

En annen grunn er at tsconfig.json kan ha følgende innstillinger

"strict": true, /* Aktiver alle strenge typekontrollalternativer. */

Hvis du fjerner linjen, bør feilen forsvinne.

Relaterte artikler