2015-11-15 9 views
11

È possibile utilizzare NodeJS 'events.EventEmitter con una classe TypeScript? Se sì, come?NodeJS EventEmitter con classe TypeScript

Ho provato innumerevoli variazioni nelle ultime ore per farlo funzionare, quindi non ne elenco nessuno.

Quello che fondamentalmente voglio fare:

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'); 
     }); 
    } 
} 

risposta

14

Si dovrebbe scaricare tipizzazioni nodo:

$ tsd install node --save 

e poi basta utilizzare il seguente codice:

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

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

ho semplificato al prova il tuo problema principale

Edit: modificata in base al commento:

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

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

new Database(); 
+0

Ma io kinda bisogno di estendere la classe, in modo che possa usare '.on()' ecc sulla mia istanza, giusto? 'errore TS2339: la proprietà 'on' non esiste sul tipo 'Database'. – Brettetete

+0

Puoi provare il codice modificato allora? –

+0

Funziona nella tua versione, ma non nel mio callback. Non mi sento molto a mio agio con OOP JS. Così ho aggiunto 'var that = this;' e ho usato 'that.emit' nella mia callback che funziona - Suppongo che sia ok – Brettetete

13

Nuovo approccio:

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

import {EventEmitter} from 'events'; 

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

new Database();