andywer / andywer/typed-emitter

[QUESTION] How can I use in an abstract class that extends `EventEmitter`?

Aberta
#30 5 comentários 0 reações 0 responsáveis Ver no GitHub
question
Linguagem predominante
JavaScript
Estrelas
285
Forks
29
Métricas de merge de PRs
Nenhum PR com merge em 30d

Descrição

Thank you for the package! I'm struggling to achieve something that I'm sure is an easy task for some. Is this possible?

How can I extend an abstract `EventEmitter` class, with common events?

**Example:**

```typescript
import EventEmitter from "events";
import TypedEmitter from "typed-emitter";

type BaseEvents = {
BASE_EVENT: (arg: string) => void;
};

abstract class BaseEmitter extends (EventEmitter as {
new (): TypedEmitter;
}) {
constructor() {
super();
// How can I make this type safe ????
this.emit("BASE_EVENT", "string-value"); // <-- How can I achieve type safety here
}
}

type ImpOneEvents = {
C1_EVENT: (a: number) => void;
};
class ImpOne extends BaseEmitter {
constructor() {
super();
this.emit("C1_EVENT", 1); // OK: type checks ok (GOOD)
this.emit("C1_EVENT", "bla"); // ERROR: string not assignable (GOOD)
}
}

type ImpTwoEvents = {
C2_EVENT: (a: boolean) => void;
};
class ImpTwo extends BaseEmitter {
constructor() {
super();
this.emit("C2_EVENT", true); // OK: type checks ok (GOOD)
}
}

const impTwo = new ImpTwo();
impTwo.on("C2_EVENT", (a) => {
parseFloat(a); // ERROR: Type of boolean not assignable to parameter of type string (GOOD)
});
```

I've tried

```typescript
type BaseEvents = {
BASE_EVENT: (arg: string) => void;
};

abstract class BaseEmitter extends (EventEmitter as {
new (): TypedEmitter;
}) {
...
```
And lots of other things. The above results in

`Argument of type '[string]' is not assignable to parameter of type 'Arguments<(T & BaseEvents)["BASE_EVENT"]>'.`

For line

```typescript
this.emit("BASE_EVENT", "string-value"); // <-- How can I achieve type safety here
```

Guia de contribuição

Nenhum guia de contribuição indexado para este repositório

Avaliação

Esta issue ainda não foi avaliada.

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.