Создайте функцию, которая наследуется от EventEmitter - PullRequest
0 голосов
/ 12 мая 2018

Используя TypeScript, есть ли способ объявить функцию (не класс), которая наследуется от EventEmitter?

При использовании vanilla JS это возможно, но не уверен, как это сделать с TS.

export const foo = function extends EventEmitter(){   // lol no

    return {}; // (I need to return something here)
};

вот как вы реализуете это с помощью JS (последний раз, когда я проверял):

const p = Object.assign(Object.create(Function.prototype), EventEmitter.prototype);

Object.setPrototypeOf(foo, p);

Если я пытаюсь сделать это с помощью TS, я получаю эту проблему / ошибку:

enter image description here

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Чтобы сделать это правильно и заставить TypeScript играть хорошо, мы создаем вспомогательную функцию, которая имеет правильную подпись:

import EventEmitter = NodeJS.EventEmitter;

export interface FunctionEmitter extends Function, EventEmitter {
}

export const makeFunctionEmitter = function (fn: Function): FunctionEmitter {

  const p = Object.assign(Object.create(Function.prototype), EventEmitter.prototype);
  Object.setPrototypeOf(fn, p);
  EventEmitter.call(fn);
  return fn as FunctionEmitter;

};

, тогда мы просто используем ее так:

export interface MyActualType extends FunctionEmitter{
  (a: string, b: boolean, c: number): X
}

export const myFuncEmitter = makeFunctionEmitter(<MyActualType >function(a,b,c){

   return X;
});
0 голосов
/ 12 мая 2018

Поскольку вы хотите вручную преобразовать функцию во что-то другое, вам также необходимо вручную привести ее:)

import { EventEmitter } from "events";
function target(emitter: EventEmitter){
  emitter.on('foo', ()=>{})
  console.log(emitter.on);
}
let f = function f(){}
const casted = Object.assign(f.prototype, EventEmitter.prototype) as EventEmitter
target(casted);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...