TypeScript报错:any类型表达式无法用于索引类型如何修复?
问题根源
报错有两个核心诱因:
- 类型不匹配:你用
any类型的变量e去索引emojiData对象,TypeScript无法确认e是否是emojiData的合法键,因此抛出隐式any的索引错误。 - 语法笔误:代码最后一行写的是
emojiData.e,这是读取emojiData上名为e的固定属性,不是你想要的动态索引emojiData[e],也会导致运行异常。
修复方案
- 首先通过
keyof typeof emojiData拿到emojiData所有键的联合类型,替换e的any类型声明 - 修正动态索引的语法错误,把
emojiData.e改为emojiData[e] - 如果
newEmojis是外部输入的数据,建议加一层类型守卫,确认e确实是emojiData的合法键,避免运行时报错
修复后的完整代码:
import * as emojiData from '../../emojify/emoji-data.json' // 定义emojiData的合法键类型 type EmojiKey = keyof typeof emojiData newEmojis.forEach((e: unknown) => { // 类型守卫校验合法性 if (typeof e === 'string' && e in emojiData) { const validKey = e as EmojiKey console.log(e) console.log(Object.keys(emojiData[validKey])) client.bot.createMessage(message.channel.id, `${Object.keys(emojiData[validKey])[0]}`); } })
如果你的TypeScript没有开启resolveJsonModule配置,无法自动推导JSON导入的类型,可以手动给emojiData声明通用索引类型:
const emojiData: Record<string, Record<string, number>> = require('../../emojify/emoji-data.json')
内容的提问来源于stack exchange,提问作者jaal kamza
相关产品推荐
相关产品推荐

