安装discord.js后,TypeScript中EventEmitter子类无法调用on/emit方法
解决discord.js安装后EventEmitter继承类无法调用on/emit方法的问题
问题根源是discord.js自带的EventEmitter类型定义会和Node.js原生events模块的类型冲突,导致你的Listeners类继承的EventEmitter丢失了on、emit等方法的类型声明。
具体解决步骤:
明确导入Node.js原生EventEmitter
把Listeners类里的导入改成带node:前缀的形式,强制指向Node.js原生模块,避免被discord.js的类型定义干扰:import { EventEmitter } from 'node:events';修正代码里的两处小错误
- index.ts中
new Listeners(connection)是错误调用,你的Listeners构造函数没有参数,要改成new Listeners() - 原代码里
emit的事件名是'market',但监听用的是'message',这会导致监听不到事件,需要统一事件名
- index.ts中
修改后的完整代码:
listeners.ts
import { EventEmitter } from 'node:events'; export class Listeners extends EventEmitter { private subscriptions: number[] = []; constructor() { super(); } public async start() { const mySub = await this.subscribe('test'); this.subscriptions.push(mySub); } private async subscribe(msg: string): Promise<number> { this.emit('market', msg); return Promise.resolve(1); } }
index.ts
import { Listeners } from './listeners'; const runListener = async () => { const listeners = new Listeners(); await listeners.start(); listeners.on('market', (msg: string) => { console.log('收到事件:', msg); // 执行你的业务操作 }); } runListener();
额外检查(可选)
如果问题仍存在,检查你的tsconfig.json:
- 确保
moduleResolution设置为NodeNext或Node16,让Node.js模块的解析逻辑更准确 - 避免在
types数组里意外引入discord.js的类型,导致覆盖原生模块声明
内容的提问来源于stack exchange,提问作者scapegoat17
相关产品推荐
相关产品推荐

