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

安装discord.js后,TypeScript中EventEmitter子类无法调用on/emit方法

解决discord.js安装后EventEmitter继承类无法调用on/emit方法的问题

问题根源是discord.js自带的EventEmitter类型定义会和Node.js原生events模块的类型冲突,导致你的Listeners类继承的EventEmitter丢失了on、emit等方法的类型声明。

具体解决步骤:

  1. 明确导入Node.js原生EventEmitter
    把Listeners类里的导入改成带node:前缀的形式,强制指向Node.js原生模块,避免被discord.js的类型定义干扰:

    import { EventEmitter } from 'node:events';
    
  2. 修正代码里的两处小错误

    • index.ts中new Listeners(connection)是错误调用,你的Listeners构造函数没有参数,要改成new Listeners()
    • 原代码里emit的事件名是'market',但监听用的是'message',这会导致监听不到事件,需要统一事件名

修改后的完整代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:12:35