Discord.JS v14 + NestJS:添加用户数组到频道权限遇类型错误
解决NestJS(TypeScript)中discord.js权限覆盖的类型不匹配问题
问题原因
纯JavaScript环境下discord.js会自动兼容字符串形式的权限名称,但TypeScript对OverwriteResolvable类型有严格校验:allow/deny字段需要是PermissionResolvable类型,虽然字符串属于合法的PermissionResolvable,但TS无法自动推导你的字符串数组符合该类型要求,因此抛出类型不匹配错误。
解决方案
方法1:使用discord.js官方权限常量(推荐)
直接调用PermissionsBitField.Flags下的枚举值,让TS自动识别合法类型,同时避免字符串拼写错误:
import { PermissionsBitField } from 'discord.js'; const stagechannel = interaction.guild.channels.cache.get('1012807170393378927'); const ticketsSupportRoles = ["772447005297475626"]; const supportRoles = ticketsSupportRoles.map(x => { return { id: x, allow: [PermissionsBitField.Flags.ViewChannel] }; }); stagechannel.edit({ permissionOverwrites: [ { id: interaction.guild.id, allow: [PermissionsBitField.Flags.Connect, PermissionsBitField.Flags.ViewChannel], deny: [ PermissionsBitField.Flags.MoveMembers, PermissionsBitField.Flags.ModerateMembers, PermissionsBitField.Flags.MuteMembers, PermissionsBitField.Flags.ManageChannels, PermissionsBitField.Flags.MentionEveryone ] }, ...supportRoles ], });
方法2:给数组指定明确类型
直接声明supportRoles为OverwriteResolvable[]类型,跳过TS的自动推导:
import { OverwriteResolvable } from 'discord.js'; const stagechannel = interaction.guild.channels.cache.get('1012807170393378927'); const ticketsSupportRoles = ["772447005297475626"]; const supportRoles: OverwriteResolvable[] = ticketsSupportRoles.map(x => { return { id: x, allow: ["ViewChannel"] }; }); stagechannel.edit({ permissionOverwrites: [ { id: interaction.guild.id, allow: ['Connect', 'ViewChannel'], deny: ['MoveMembers', 'ModerateMembers', 'MuteMembers', 'ManageChannels', 'MentionEveryone'] }, ...supportRoles ], });
方法3:单个对象类型断言
给每个映射生成的权限对象断言为OverwriteResolvable:
import { OverwriteResolvable } from 'discord.js'; const stagechannel = interaction.guild.channels.cache.get('1012807170393378927'); const ticketsSupportRoles = ["772447005297475626"]; const supportRoles = ticketsSupportRoles.map(x => { return { id: x, allow: ["ViewChannel"] } as OverwriteResolvable; }); stagechannel.edit({ permissionOverwrites: [ { id: interaction.guild.id, allow: ['Connect', 'ViewChannel'], deny: ['MoveMembers', 'ModerateMembers', 'MuteMembers', 'ManageChannels', 'MentionEveryone'] }, ...supportRoles ], });
内容的提问来源于stack exchange,提问作者Mirt
相关产品推荐
相关产品推荐

