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

discord.js机器人对自身回复添加表情反应及react报错解决

Discord.js 交互回复添加表情反应类型报错解决方案

报错核心原因

  • 未加await时,interaction.reply()返回值是Promise类型,直接调用react属于语法逻辑错误,添加await的修正方向是正确的,但未解决TypeScript类型判定问题。
  • TypeScript默认将fetchReply: true模式下的interaction.reply()返回值识别为APIMessage | Message联合类型:其中APIMessage是Discord接口返回的原始数据结构,没有挂载discord.js封装的react实例方法,因此TS会抛出属性不存在的类型错误。
  • 额外隐藏问题:初始代码中配置了ephemeral: true(仅触发用户可见的临时消息),Discord平台本身不支持给临时消息添加表情反应,即使解决类型问题,运行时也会抛出接口错误。

可直接落地的解决方法

方法1:类型断言(写法最简便)

直接通过类型断言告诉TypeScript返回值为Message实例,适合业务逻辑确定、无边缘返回场景,修改后代码如下:

import { Message } from 'discord.js'
import { ICommand } from 'wokcommands'

export default {
  category: 'Testing',
  description: 'Replies with pong',
  slash: true,
  testOnly: false,
  callback: async ({ interaction }) => {
    const reply = 'pong'
    // 注意:添加反应必须移除ephemeral: true配置
    const replyMessage = await interaction.reply({
      content: reply,
      fetchReply: true,
    }) as Message

    replyMessage.react('👍🏽')
  },
} as ICommand

方法2:运行时类型校验(逻辑更严谨)

如果需要兼容边缘返回场景,可以添加实例判断逻辑,TypeScript会自动完成类型收窄,不需要额外写类型断言:

callback: async ({ interaction }) => {
  const reply = 'pong'
  const replyMessage = await interaction.reply({
    content: reply,
    fetchReply: true,
  })

  if (replyMessage instanceof Message) {
    replyMessage.react('👍🏽')
  }
},

注意事项

  • 移除ephemeral: true配置是功能正常运行的前提,该限制为Discord平台规则,和discord.js版本、代码写法无关。
  • 确保Message类是从discord.js包直接导入,不要自定义同名类型造成导入覆盖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:30:51