andywer / andywer/typed-emitter
[QUESTION] How can I use in an abstract class that extends `EventEmitter`?
- 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.