2015-11-15 16 views
11

Có thể sử dụng NodeJS 'events.EventEmitter với lớp TypeScript không? Nếu có, làm thế nào?NodeJS EventEmitter với lớp TypeScript

Tôi đã thử vô số biến thể trong những giờ qua để làm việc này, vì vậy tôi sẽ không liệt kê bất kỳ biến thể nào trong số đó.

Những gì tôi về cơ bản muốn làm:

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

Trả lời

14

Bạn nên tải typings nút:

$ tsd install node --save 

và sau đó chỉ cần sử dụng đoạn mã sau:

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

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

tôi đơn giản hóa nó để kiểm tra vấn đề chính của bạn.

Edit: Modified dựa trên nhận xét của bạn:

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

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

new Database(); 
+0

Nhưng tôi kinda cần phải mở rộng các lớp, để tôi có thể sử dụng '.Trên()' vv trên trường hợp của tôi, phải không? 'lỗi TS2339: Thuộc tính 'trên' không tồn tại trên loại 'Cơ sở dữ liệu'.' – Brettetete

+0

Bạn có thể thử mã đã sửa đổi không? –

+0

Tính năng này hoạt động trong phiên bản của bạn, nhưng không có trong hàm gọi lại của tôi. Tôi không cảm thấy thoải mái với OOP JS. Vì vậy, tôi đã thêm 'var that = this;' và được sử dụng 'that.emit' trong hàm gọi lại của tôi, hoạt động - Tôi đoán đó là tiền phạt – Brettetete

13

Cách tiếp cận mới:

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

import {EventEmitter} from 'events'; 

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

new Database(); 
Các vấn đề liên quan