Bagaimana cara saya menulis ulang pernyataan ini dalam gaya TypeScript ES6 'EventEmitter = require('events').EventEmitter'?

Seperti judulnya, saya ingin menulis ulang pernyataan di bawah ini dalam TypeScript

EventEmitter = require('events').EventEmitter

ke gaya ES6

import {EventEmitter} from "events"

Saya tidak yakin apakah keduanya setara, sebenarnya saya berpikir keduanya tidak setara karena ketika saya mencoba menggunakan RxJS dengan pernyataan kedua di atas, contoh di bawah ini tidak dikompilasi padahal lakukan dengan yang pertama.

Saya mendapatkan kesalahan berikut ketika saya menggunakan pernyataan kedua di atas.

.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'.

Contoh:

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 sumber
comment
kemungkinan duplikat ES6 - Konversi dari 'require' ke 'import' - tidak yakin karena keterlibatan TypeScript   -  person Bergi    schedule 07.06.2016


Jawaban (3)


Sudahlah itu berhasil! itu hanya masalah dengan file definisi Rx.

Saya mengubah yang berikut ini.

import * as Rx from "rx"

to

const Rx = require('rx')

dan mempertahankan gaya impor ES6 untuk mengimpor EventEmitter.

person Eyal Alon    schedule 17.09.2015
comment
dengan menggunakan const Rx = require('rx') Anda mematikan pemeriksaan tipe untuk variabel Rx. Jangan lakukan ini. - person basarat; 18.09.2015
comment
Yup, aku tahu tapi sepertinya aku tidak punya pilihan. - person Eyal Alon; 18.09.2015

Argumen tipe 'EventEmitter' tidak dapat ditetapkan

Membaca dokumen: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromevent.md contoh Anda pasti bisa.

Ini adalah bug dalam definisi RX. Definisi tipe harus secara eksplisit mendukung EventEmitter atau membuatnya kompatibel dengan instance EventEmitter.

person basarat    schedule 17.09.2015
comment
Apa sebenarnya yang Anda maksud dengan menggunakan pemancar acara Rx? apa yang harus saya lakukan agar bisa berfungsi? - person Eyal Alon; 18.09.2015
comment
Maaf. Saya salah. Memperbaiki jawaban setelah membaca dokumen dan menyelidiki lebih lanjut - person basarat; 18.09.2015

Saya tidak suka solusi tetapi yang saya lakukan untuk membuatnya berfungsi adalah mematikan tipe menggunakan 'apa saja'.

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