You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript字符映射报错:string无法索引{}类型,求添加索引签名方案

解决TypeScript字谜判断代码中的TS7053错误

错误原因

你遇到的TS7053错误,核心原因是TypeScript将空对象{}默认推断为无索引签名的类型。当你用字符串类型的字符作为键访问该对象时,TypeScript无法确定键对应的值类型,因此抛出"隐式any类型"的报错。

解决方案:给字符映射添加明确类型定义

你需要为存储字符计数的对象指定类型,以下是两种常用且简洁的实现方式:

方式1:使用TypeScript内置Record工具类型

Record<string, number>是TS提供的工具类型,可快速定义"键为string、值为number"的对象结构,直接修改createCharacterMap函数即可:

function createCharacterMap(text: string): Record<string, number> {
  let map: Record<string, number> = {};
  for (let char of text) {
      char = char.toLowerCase();
      if (map.hasOwnProperty(char)) {
          map[char]++;
      } else {
          map[char] = 1;
      }
  }
  return map;
}

方式2:自定义接口(语义更清晰)

如果希望类型定义的可读性更强,可以自定义一个接口来描述字符映射结构:

// 自定义字符映射接口
interface CharacterMap {
  [key: string]: number;
}

function createCharacterMap(text: string): CharacterMap {
  let map: CharacterMap = {};
  for (let char of text) {
      char = char.toLowerCase();
      if (map.hasOwnProperty(char)) {
          map[char]++;
      } else {
          map[char] = 1;
      }
  }
  return map;
}

修改后的完整代码

/** 
 * @param {string} str1 - 第一个字符串
 * @param {string} str2 - 第二个字符串
 * @return {string} 字谜比较结果
 */
function isAnagram(str1: string, str2: string): string {

  // 提前退出:相同字符串直接判定为字谜
  if(str1 === str2) {
    return "ANAGRAM";
  }
  // 长度不同直接退出
  if (str1.length !== str2.length) {
    console.log('Strings not same length');
    return "NOT ANAGRAM!";
  }

  // 定义字符映射类型
  interface CharacterMap {
    [key: string]: number;
  }

  // 生成字符映射的函数
  function createCharacterMap(text: string): CharacterMap {
    let map: CharacterMap = {};
    for (let char of text) {
        char = char.toLowerCase();
        if (map.hasOwnProperty(char)) {
            map[char]++;
        } else {
            map[char] = 1;
        }
    }
    return map;
  }

  const str1map = createCharacterMap(str1);
  const str2map = createCharacterMap(str2);

  // 对比字符计数
  for (let char in str1map) {
    if (str1map[char] !== str2map[char]) {
      return "NOT ANAGRAM!";
    }
  }
 
  return "ANAGRAM!";
}

module.exports = { isAnagram };

额外优化点

  • 修正了原JSDoc中参数注释的格式错误,使其符合规范
  • 给isAnagram函数添加了返回值类型注解: string,强化类型检查

内容的提问来源于stack exchange,提问作者morganwebdev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 09:40:26