新版discord.js TypeScript开发报TS2344内置类型错误如何解决
问题描述
使用最新版discord.js + TypeScript开发Discord机器人时,仅编写基础客户端初始化代码,编译时就出现4个来自discord.js自身类型定义文件node_modules/discord.js/typings/index.d.ts的TS2344错误,核心报错为Type 'MappedInteractionTypes<Cached>[T]' does not satisfy the constraint,涉及ButtonInteraction、SelectMenuInteraction、ModalSubmitInteraction、MessageComponentInteraction等交互类型的channel属性类型不兼容,DMChannel等频道类型无法赋值给GuildTextBasedChannel、VoiceChannel等目标类型。
复现用的初始化代码如下:
import { Client, Intents } from "discord.js"; const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MEMBERS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MESSAGE_REACTIONS ] });
问题原因
该报错和自行编写的业务代码无关,常见触发原因有两类:
- 本地TypeScript版本过低:discord.js v14全系列使用了TS 4.9及以上版本才支持的高阶条件映射类型语法,低版本TS无法正确推导库中的联合类型约束,会误报类型不兼容。
- 安装的discord.js为存在类型缺陷的早期v14版本:14.0.x~14.3.x的初始版本存在官方类型定义疏漏,编写交互相关类型映射时未将DMChannel等非公会频道类型纳入channel属性的联合类型范围,直接触发TS2344类型约束不满足错误。
另外示例代码中使用的Intents.FLAGS是discord.js v13的旧写法,v14版本已对该枚举重命名,升级依赖后需要同步调整初始化代码,否则会触发新的枚举不存在报错。
修复步骤
按顺序执行以下操作即可解决问题:
- 升级本地开发依赖的TypeScript到符合要求的版本,执行命令:
npm install typescript@latest --save-dev - 升级discord.js到最新稳定版,安装官方已经修复类型bug的正式版本,执行命令:
npm install discord.js@latest - 调整客户端初始化代码,适配v14版本的枚举命名变更,修正后的代码如下:
import { Client, GatewayIntentBits } from "discord.js"; const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, GatewayIntentBits.GuildMessages, GatewayIntentBits.GuildMessageReactions ] }); - (兜底方案)如果升级后仍偶发第三方库类型校验报错,可以打开项目的
tsconfig.json文件,在compilerOptions节点下添加配置:
该配置只会跳过node_modules下第三方库的类型文件检查,不会影响自身业务代码的类型校验,可彻底规避第三方库偶发的类型兼容问题。{ "compilerOptions": { "skipLibCheck": true // 其他原有配置保持不变 } }
内容的提问来源于stack exchange,提问作者Dissonance
相关产品推荐
相关产品推荐

