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
相关产品推荐
相关产品推荐

