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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 05:45:37