ฉันจะเขียนคำสั่งนี้ใหม่ในรูปแบบ TypeScript ES6 'EventEmitter = need('events').EventEmitter' ได้อย่างไร

เช่นเดียวกับชื่อหัวข้อ ฉันต้องการเขียนคำสั่งด้านล่างใหม่ใน TypeScript

EventEmitter = require('events').EventEmitter

สู่สไตล์ ES6

import {EventEmitter} from "events"

ฉันไม่แน่ใจว่าทั้งสองนี้เทียบเท่ากันหรือไม่ อันที่จริง คิดว่า ไม่ใช่เพราะเมื่อฉันพยายามใช้ RxJS กับคำสั่งที่สองด้านบน มันจะไม่รวบรวมตัวอย่างด้านล่างในขณะที่ ทำกับอันแรก

ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อฉันใช้คำสั่งที่สองด้านบน

.build/lib/process.ts(12,3): error TS2345: Argument of type 'EventEmitter' is not assignable to parameter of type '{ on: (name: string, cb: (e: any) => any) => void; off: (name: string, cb: (e: any) => any) => vo...'.
    Property 'off' is missing in type 'EventEmitter'.

ตัวอย่าง:

var EventEmitter = require('events').EventEmitter,
    Rx = require('rx');

var eventEmitter = new EventEmitter();

var source = Rx.Observable.fromEvent(
  eventEmitter,
  'data',
  function (foo, bar) { return { foo: bar, bar: bar }; });

var subscription = source.subscribe(
  function (x) {
    console.log('Next: foo -' + x.foo + ', bar -' + x.bar);
  },
  function (err) {
    console.log('Error: ' + err);
  },
  function () {
    console.log('Completed');
  });

eventEmitter.emit('data', 'baz', 'quux');
// => Next: foo - baz, bar - quux

person Eyal Alon    schedule 17.09.2015    source แหล่งที่มา
comment
เป็นไปได้ที่ซ้ำกันของ ES6 - แปลงจาก 'require' เป็น 'import' - ไม่แน่ใจเนื่องจากการมีส่วนร่วมของ typescript   -  person Bergi    schedule 07.06.2016


คำตอบ (3)


ไม่เป็นไรมันใช้งานได้! มันเป็นเพียงปัญหากับไฟล์คำจำกัดความ Rx

ฉันเปลี่ยนสิ่งต่อไปนี้

import * as Rx from "rx"

to

const Rx = require('rx')

และเก็บสไตล์การนำเข้า ES6 ไว้เพื่อนำเข้า EventEmitter

person Eyal Alon    schedule 17.09.2015
comment
โดยใช้ const Rx = require('rx') คุณกำลัง ปิดการตรวจสอบประเภทสำหรับตัวแปร Rx อย่าทำเช่นนี้ - person basarat; 18.09.2015
comment
ใช่ ฉันรู้ แต่ดูเหมือนว่าฉันไม่มีทางเลือก - person Eyal Alon; 18.09.2015

ไม่สามารถกำหนดอาร์กิวเมนต์ประเภท 'EventEmitter' ได้

การอ่านเอกสาร: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromevent.md ตัวอย่างของคุณควรจะได้ผลอย่างแน่นอน

นี่เป็นจุดบกพร่องในคำจำกัดความของ RX คำจำกัดความของประเภทควรสนับสนุน EventEmitter อย่างชัดเจน หรือทำให้เข้ากันได้กับอินสแตนซ์ EventEmitter

person basarat    schedule 17.09.2015
comment
คุณหมายถึงอะไรกันแน่โดยใช้ตัวปล่อยเหตุการณ์ Rx? ฉันต้องทำอะไรเพื่อให้มันทำงานได้? - person Eyal Alon; 18.09.2015
comment
ขอโทษ. ฉันผิดไป. แก้ไขคำตอบหลังจากอ่านเอกสารและตรวจสอบเพิ่มเติม - person basarat; 18.09.2015

ฉันไม่ชอบ วิธีแก้ปัญหา แต่สิ่งที่ฉันทำเพื่อให้ได้ผลคือปิดประเภทที่ใช้ 'any'

var eventEmitter: any = new EventEmitter();
person Eyal Alon    schedule 18.09.2015