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

TypeScript报错:any类型表达式无法用于索引类型如何修复?

问题根源

报错有两个核心诱因:

  1. 类型不匹配:你用any类型的变量e去索引emojiData对象,TypeScript无法确认e是否是emojiData的合法键,因此抛出隐式any的索引错误。
  2. 语法笔误:代码最后一行写的是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:21:01