andywer / andywer/typed-emitter

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

Ouverte
#30 5 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
question
Langage dominant
JavaScript
Étoiles
285
Forks
29
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

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
```

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.