使用TypeScript开发Discord机器人昵称命令时出现TS语法错误如何解决?
错误原因
两个报错均是三元运算符语法不完整导致:
- 第一次报错
Expression expected.ts(1109):三元运算符的固定结构为条件 ? 条件成立时返回值 : 条件不成立时返回值,你的代码里:后面没有写条件不成立的返回值,直接断行写了下一行变量声明,不符合语法规则。 - 替换为逗号后报错
':' expected ts(1005):用逗号分隔const声明的多个变量时,前面的赋值表达式未闭合,同样不符合语法规则。
修复方案
1. 补全三元表达式
你当前的命令同时支持前缀消息和斜杠调用,message不存在时即为斜杠调用场景,需要补全该场景下取目标用户的逻辑,同时补全三元运算符的缺失部分。
2. 兼容斜杠调用的回复逻辑
斜杠调用时message为undefined,直接调用message.reply会触发运行时报错,需要统一兼容两种场景的回复方法。
修正后完整代码
import "discord.js"; import { ICommand } from "wokcommands"; export default{ name: 'nickname', category: 'Moderation', aliases: ['nick'], description: '修改用户昵称', permissions: ['MANAGE_NICKNAMES'], slash: 'both', // 斜杠命令参数配置,调用时可以直接选用户和填写昵称 options: [ { name: '用户', type: 'USER', description: '要修改昵称的目标用户', required: true }, { name: '新昵称', type: 'STRING', description: '要设置的新昵称', required: true } ], testonly: true, callback: async({ client, message, args, interaction }) => { // 兼容两种调用场景的回复方法 const sendReply = (content: string) => { return message ? message.reply(content) : interaction.reply({ content }) } // 兼容两种场景取目标成员 const mentionedMember = message ? message.mentions.members?.first() : interaction.options.getMember('用户'); // 兼容两种场景取新昵称 const nickName = message ? args.slice(1).join(" ") : interaction.options.getString('新昵称'); if (!mentionedMember) return sendReply('请指定要修改昵称的目标用户,用法:`>nickname @用户 新昵称`'); if (!nickName) return sendReply('请输入要设置的新昵称'); if (!mentionedMember.kickable) return sendReply('该用户角色等级高于我,我无法修改他的昵称'); await mentionedMember.setNickname(nickName); await sendReply(`成功将 ${mentionedMember} 的昵称修改为 ${nickName}`); }, } as ICommand
内容的提问来源于stack exchange,提问作者user15547690
相关产品推荐
相关产品推荐

