2015-11-15 68 views
11

是否可以將NodeJS'events.EventEmitter與TypeScript類一起使用?如果是,如何?帶TypeScript類的NodeJS EventEmitter

我已經在最後幾個小時嘗試了無數變化來獲得這個工作,所以我不會列出他們中的任何一個。

我基本上要做到:

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

回答

14

你應該下載節點分型:

$ 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(); 
+0

但我還挺需要擴展類,這樣我可以用'。對()'等我的實例,對嗎? '錯誤TS2339:屬性'on'在類型'Database'上不存在.' – Brettetete

+0

那麼你可以嘗試修改後的代碼嗎? –

+0

這適用於您的版本,但不適用於我的回調。我對OOP JS不太滿意。所以我添加了'var that = this;'並在我的回調中使用了'that.emit'這個工作原理 - 我想這很好 – Brettetete

13

新方法:

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

import {EventEmitter} from 'events'; 

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

new Database();