Skip to content

Commit

Permalink
fix(typings): add fallback to untyped event listener
Browse files Browse the repository at this point in the history
  • Loading branch information
darrachequesne committed May 6, 2021
1 parent e20d487 commit 5394669
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 5 deletions.
22 changes: 17 additions & 5 deletions lib/typed-events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,23 @@ export type ReservedOrUserListener<
ReservedEvents extends EventsMap,
UserEvents extends EventsMap,
Ev extends ReservedOrUserEventNames<ReservedEvents, UserEvents>
> = Ev extends EventNames<ReservedEvents>
? ReservedEvents[Ev]
: Ev extends EventNames<UserEvents>
? UserEvents[Ev]
: never;
> = FallbackToUntypedListener<
Ev extends EventNames<ReservedEvents>
? ReservedEvents[Ev]
: Ev extends EventNames<UserEvents>
? UserEvents[Ev]
: never
>;

/**
* Returns an untyped listener type if `T` is `never`; otherwise, returns `T`.
*
* This is a hack to mitigate https://github.com/socketio/socket.io/issues/3833.
* Needed because of https://github.com/microsoft/TypeScript/issues/41778
*/
type FallbackToUntypedListener<T> = [T] extends [never]
? (...args: any[]) => void
: T;

/**
* Strictly typed version of an `EventEmitter`. A `TypedEventEmitter` takes type
Expand Down
20 changes: 20 additions & 0 deletions test/typed-events.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,26 @@ describe("typed events", () => {
expectType<any>(c);
});
});

it("infers 'any' for listener parameters of other events using enums", () => {
const socket = io();

enum Events {
TEST = "test",
}

socket.on("test", (a, b, c) => {
expectType<any>(a);
expectType<any>(b);
expectType<any>(c);
});

socket.on(Events.TEST, (a, b, c) => {
expectType<any>(a);
expectType<any>(b);
expectType<any>(c);
});
});
});

describe("emit", () => {
Expand Down

0 comments on commit 5394669

Please sign in to comment.