Как мне переписать этот оператор в стиле TypeScript ES6 «EventEmitter = require('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 - преобразование из "требуется" в "импорт" - не уверен из-за участия 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

Мне не нравится решение, но что я сделал, чтобы оно заработало, так это отключил типы, используя «любой».

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