Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

TypeScript – Object character map – Element implicitly has an 'any' type because expression of type 'string' can't be used to index type

I am new to TypeScript. I looked at similar questions and this one seemed different enough to ask on its own to me because it is a character map. I am confused by the syntax and several blog posts I saw about this error.

The following code has been partially converted from JavaScript to TypeScript. It is supposed to compare two strings to see if they are anagrams, a common code challenge. When I try and compile I get the following errors:

src/variations.ts:24:13 - error TS7053: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{}'.
  No index signature with a parameter of type 'string' was found on type '{}'.

24             map[char]++;
               ~~~~~~~~~
src/variations.ts:26:13 - error TS7053: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{}'.
  No index signature with a parameter of type 'string' was found on type '{}'.

26             map[char] = 1;
               ~~~~~~~~~
src/variations.ts:38:9 - error TS7053: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{}'.
  No index signature with a parameter of type 'string' was found on type '{}'.

38     if (str1map[char] !== str2map[char]) {
           ~~~~~~~~~~~~~
src/variations.ts:38:27 - error TS7053: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{}'.
  No index signature with a parameter of type 'string' was found on type '{}'.

38     if (str1map[char] !== str2map[char]) {
                             ~~~~~~~~~~~~~

Code: src/variations.ts

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

/** 
 * @param {string} string 1, 
 * @param {string} string 2,
 * @return {string} result of anagram comparison
 */
function isAnagram(str1: string, str2: string) {

  // Earliest correct exit opportunity: identical strings are anagram
  if(str1 === str2) {
    return "ANAGRAM";
  }
  // Are the strings the same length? Exit if not;
  if (str1.length !== str2.length) {
    console.log('Strings not same length');
    return "NOT ANAGRAM!";
  }

  // Function to create character map from a string
  function createCharacterMap(text: string) {
    let map = {};
    for (let char of text) {
        char = char.toLowerCase();
        if (map.hasOwnProperty(char)) {
            map[char]++;
        } else {
            map[char] = 1;
        }
    }
    return map;
  }
  // Create Character Maps
  const str1map = createCharacterMap(str1);
  const str2map = createCharacterMap(str2);

  // Is character in str1 in str2?
  // NB: Issue of characters existing in str2 but not str1 addressed by string length check
  for (let char in str1map) {
    if (str1map[char] !== str2map[char]) {
      return "NOT ANAGRAM!";
    }
  }
 
  return "ANAGRAM!";
}

module.exports = { isAnagram };

I would appreciate help. I simply dont get how to create this index signature given the character map configuration

>Solution :

It’s because your map let map = {}; has neither a type nor a default field, so typescript sees this as an implicit any type.

To resolve this, you can use let map: any = {}; to have an explicit any type,

or let map = {[char: string]: number} = {}; for true typing

Edit: if you didn’t know, the syntax to define an object with a format of key/value is {[KeyName: KeyType]: ValueType, Otherkey: itstype, …}

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading