NodeJS EventEmitter с классом TypeScript

Можно ли использовать NodeJS 'events.EventEmitter с классом TypeScript? Если да, то как?

Я пробовал бесчисленное количество вариантов за последние часы, чтобы заставить это работать, поэтому я не буду перечислять ни один из них.

Что я в основном хочу делать:

export class Database{
    constructor(cfg:IDatabaseConfiguration) {
        // events.EventEmitter.call(this); 
        mongoose.connect(cfg.getConnectionString(), cfg.getCredentials(), function (err:any) {
            if (err)
                this.emit('error', err);
            else
                this.emit('ready');
        });
    }
}

person boop    schedule 15.11.2015    source источник
comment
Хорошее решение см. В следующих разделах: stackoverflow.com/questions/63649104/   -  person Krisztián Balla    schedule 13.01.2021


Ответы (3)


Вы должны скачать типы узлов:

$ tsd install node --save

а затем просто используйте следующий код:

///<reference path="./typings/node/node.d.ts" />
import events = require('events');

class Database{
    constructor() {
        events.EventEmitter.call(this);
    }
}

Я упростил его, чтобы проверить вашу основную проблему.

Изменить: изменено на основе вашего комментария:

///<reference path="./typings/node/node.d.ts" />
import events = require('events');

class Database extends events.EventEmitter {
    constructor() {
        super();
        this.emit('ready');
    }
}

new Database();
person Martin Vseticka    schedule 15.11.2015
comment
Но мне нужно расширить класс, чтобы я мог использовать .on() и т. Д. В моем экземпляре, верно? error TS2339: Property 'on' does not exist on type 'Database'. - person boop; 15.11.2015
comment
Это работает в вашей версии, но не в моем обратном вызове. Мне не очень нравится ООП JS. Итак, я добавил var that = this; и использовал that.emit в моем обратном вызове, который работает - я думаю, это нормально - person boop; 15.11.2015
comment
Да, чтобы он работал с this, вы можете просто изменить function (err:any) на (err:any) => (стрелочная функция). Стрелочные функции сохраняют this контекст. - person Martin Vseticka; 15.11.2015

Новый подход:

///<reference path="./typings/node/node.d.ts" />

import {EventEmitter} from 'events';

class Database extends EventEmitter {
    constructor() {
        super();
        this.emit('ready');
    }
}

new Database();
person Dominik Palo    schedule 10.09.2016

Современный способ загрузки определений типов для NodeJS и EventEmitter, в частности, yarn add @types/node или npm install @types/node

person Yuriy Gavrishov    schedule 25.11.2020