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

