Skip to content

Commit 5394669

Browse files
fix(typings): add fallback to untyped event listener
See also: socketio/socket.io@a11152f Related: - socketio/socket.io#3885 - socketio/socket.io#3872 - socketio/socket.io#3833
1 parent e20d487 commit 5394669

File tree

2 files changed

+37
-5
lines changed

2 files changed

+37
-5
lines changed

lib/typed-events.ts

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,23 @@ export type ReservedOrUserListener<
4343
ReservedEvents extends EventsMap,
4444
UserEvents extends EventsMap,
4545
Ev extends ReservedOrUserEventNames<ReservedEvents, UserEvents>
46-
> = Ev extends EventNames<ReservedEvents>
47-
? ReservedEvents[Ev]
48-
: Ev extends EventNames<UserEvents>
49-
? UserEvents[Ev]
50-
: never;
46+
> = FallbackToUntypedListener<
47+
Ev extends EventNames<ReservedEvents>
48+
? ReservedEvents[Ev]
49+
: Ev extends EventNames<UserEvents>
50+
? UserEvents[Ev]
51+
: never
52+
>;
53+
54+
/**
55+
* Returns an untyped listener type if `T` is `never`; otherwise, returns `T`.
56+
*
57+
* This is a hack to mitigate https://github.com/socketio/socket.io/issues/3833.
58+
* Needed because of https://github.com/microsoft/TypeScript/issues/41778
59+
*/
60+
type FallbackToUntypedListener<T> = [T] extends [never]
61+
? (...args: any[]) => void
62+
: T;
5163

5264
/**
5365
* Strictly typed version of an `EventEmitter`. A `TypedEventEmitter` takes type

test/typed-events.test-d.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,26 @@ describe("typed events", () => {
3131
expectType<any>(c);
3232
});
3333
});
34+
35+
it("infers 'any' for listener parameters of other events using enums", () => {
36+
const socket = io();
37+
38+
enum Events {
39+
TEST = "test",
40+
}
41+
42+
socket.on("test", (a, b, c) => {
43+
expectType<any>(a);
44+
expectType<any>(b);
45+
expectType<any>(c);
46+
});
47+
48+
socket.on(Events.TEST, (a, b, c) => {
49+
expectType<any>(a);
50+
expectType<any>(b);
51+
expectType<any>(c);
52+
});
53+
});
3454
});
3555

3656
describe("emit", () => {

0 commit comments

Comments
 (0)