Discord机器人开发遇TypeScript Property assignment expected错误
问题背景
开发Discord机器人审计日志模块时,需要为机器人接入的所有服务器自动生成审计配置条目,调用discord-auditlog包能力传入配置时,使用内嵌${guild.id}的模板字符串作为配置对象的键,TypeScript抛出Property assignment expected语法错误,代码无法正常编译运行。
复现代码
client.guilds.cache.forEach(async (guild: any) => { guildPrefs = await guildModel.findOne({ GuildID: guild.id }).catch(err => console.log(err)); let guildId: string = ''; guildId = `${guild.id}` await audit(client, { `${guild.id}`: { auditlog: guildPrefs.AuditChannel, auditmsg: guildPrefs.AuditChannel, voice: guildPrefs.AuditChannel, trackroles: true } }); })
报错原因
JS/TS对象字面量的键如果是固定字符串,可以直接写key: value形式;但如果键是动态生成的值(变量、模板字符串插值结果、表达式返回值),必须使用计算属性名语法,也就是给动态键外层包裹方括号[]。
直接在键位写${guild.id}模板字符串时,解析器会判定为非法的静态属性名写法,因此抛出属性赋值预期的语法错误。
修复方案
给作为动态键的模板字符串外层包裹方括号即可,由于guild.id本身就是字符串类型,无需额外套模板字符串,直接传入变量即可。修复后的核心代码段如下:
client.guilds.cache.forEach(async (guild: any) => { const guildPrefs = await guildModel.findOne({ GuildID: guild.id }).catch(err => console.log(err)); // 新增空值判断,避免查无配置时访问属性抛出空指针错误 if (!guildPrefs) return; await audit(client, { // 动态键必须用[]包裹,标记为计算属性 [guild.id]: { auditlog: guildPrefs.AuditChannel, auditmsg: guildPrefs.AuditChannel, voice: guildPrefs.AuditChannel, trackroles: true } }); })
注:原代码中声明后赋值的
guildId变量未被实际使用,属于冗余代码,可直接删除。
内容的提问来源于stack exchange,提问作者nikoszz
相关产品推荐
相关产品推荐

