Skip to content

Commit cb6d2e0

Browse files
ZachHaberdarrachequesne
authored andcommitted
fix(typings): calling io.emit with no arguments incorrectly errored
Refs: #4914
1 parent 80b2c34 commit cb6d2e0

File tree

2 files changed

+42
-4
lines changed

2 files changed

+42
-4
lines changed

Diff for: lib/typed-events.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,11 @@ export type EventNamesWithoutAck<
5252
> = IfAny<
5353
Last<Parameters<Map[K]>> | Map[K],
5454
K,
55-
K extends (
56-
Last<Parameters<Map[K]>> extends (...args: any[]) => any ? never : K
57-
)
55+
K extends (Parameters<Map[K]> extends never[] ? K : never)
56+
? K
57+
: K extends (
58+
Last<Parameters<Map[K]>> extends (...args: any[]) => any ? never : K
59+
)
5860
? K
5961
: never
6062
>;

Diff for: test/socket.io.test-d.ts

+37-1
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ describe("server", () => {
187187
Ev extends keyof Map = keyof Map
188188
> = (ev: Ev, ...args: Parameters<Map[Ev]>) => ReturnType<Map[Ev]>;
189189
interface ClientToServerEvents {
190+
noArgs: () => void;
190191
helloFromClient: (message: string) => void;
191192
ackFromClient: (
192193
a: string,
@@ -196,6 +197,7 @@ describe("server", () => {
196197
}
197198

198199
interface ServerToClientEvents {
200+
noArgs: () => void;
199201
helloFromServer: (message: string, x: number) => void;
200202
ackFromServer: (
201203
a: boolean,
@@ -212,12 +214,14 @@ describe("server", () => {
212214
// While these could be generated using the types from typed-events,
213215
// it's likely better to just write them out, so that both the types and this are tested properly
214216
interface ServerToClientEventsNoAck {
217+
noArgs: () => void;
215218
helloFromServer: (message: string, x: number) => void;
216219
ackFromServer: never;
217220
ackFromServerSingleArg: never;
218221
onlyCallback: never;
219222
}
220223
interface ServerToClientEventsWithError {
224+
noArgs: () => void;
221225
helloFromServer: (message: string, x: number) => void;
222226
ackFromServer: (
223227
a: boolean,
@@ -233,6 +237,7 @@ describe("server", () => {
233237
}
234238

235239
interface ServerToClientEventsWithMultiple {
240+
noArgs: () => void;
236241
helloFromServer: (message: string, x: number) => void;
237242
ackFromServer: (a: boolean, b: string, ack: (c: boolean[]) => void) => void;
238243
ackFromServerSingleArg: (
@@ -243,6 +248,7 @@ describe("server", () => {
243248
onlyCallback: (a: () => void) => void;
244249
}
245250
interface ServerToClientEventsWithMultipleAndError {
251+
noArgs: () => void;
246252
helloFromServer: (message: string, x: number) => void;
247253
ackFromServer: (
248254
a: boolean,
@@ -383,6 +389,9 @@ describe("server", () => {
383389
});
384390
it("has the correct types for `emit`", () => {
385391
const sio = new Server<ClientToServerEvents, ServerToClientEvents>();
392+
expectType<ToEmit<ServerToClientEventsWithMultipleAndError, "noArgs">>(
393+
sio.timeout(0).emit<"noArgs">
394+
);
386395
expectType<
387396
ToEmit<ServerToClientEventsWithMultipleAndError, "helloFromServer">
388397
>(sio.timeout(0).emit<"helloFromServer">);
@@ -406,6 +415,8 @@ describe("server", () => {
406415
expectType<never>(
407416
undefined as Parameters<typeof sansTimeout["emitWithAck"]>[0]
408417
);
418+
// @ts-expect-error - "noArgs" doesn't have a callback and is thus excluded
419+
sio.timeout(0).emitWithAck("noArgs");
409420
// @ts-expect-error - "helloFromServer" doesn't have a callback and is thus excluded
410421
sio.timeout(0).emitWithAck("helloFromServer");
411422
// @ts-expect-error - "onlyCallback" doesn't have a callback and is thus excluded
@@ -428,7 +439,9 @@ describe("server", () => {
428439
it("Infers correct types", () => {
429440
const sio = new Server<ClientToServerEvents, ServerToClientEvents>();
430441
const nio = sio.of("/test");
431-
442+
expectType<ToEmit<ServerToClientEventsNoAck, "noArgs">>(
443+
sio.emit<"noArgs">
444+
);
432445
expectType<ToEmit<ServerToClientEventsNoAck, "helloFromServer">>(
433446
// These errors will dissapear once the TS version is updated from 4.7.4
434447
// the TSD instance is using a newer version of TS than the workspace version
@@ -439,6 +452,7 @@ describe("server", () => {
439452
nio.emit<"helloFromServer">
440453
);
441454
sio.on("connection", (s) => {
455+
expectType<ToEmit<ServerToClientEvents, "noArgs">>(s.emit<"noArgs">);
442456
expectType<ToEmit<ServerToClientEvents, "helloFromServer">>(
443457
s.emit<"helloFromServer">
444458
);
@@ -474,6 +488,8 @@ describe("server", () => {
474488
it("Infers correct types", () => {
475489
const sio = new Server<ClientToServerEvents, ServerToClientEvents>();
476490
sio.on("connection", (s) => {
491+
// @ts-expect-error - "noArgs" doesn't have a callback and is thus excluded
492+
s.emitWithAck("noArgs");
477493
// @ts-expect-error - "helloFromServer" doesn't have a callback and is thus excluded
478494
s.emitWithAck("helloFromServer");
479495
// @ts-expect-error - "onlyCallback" doesn't have a callback and is thus excluded
@@ -506,6 +522,10 @@ describe("server", () => {
506522
srv.listen(() => {
507523
sio.on("connection", (s) => {
508524
expectType<Socket<ClientToServerEvents, ServerToClientEvents>>(s);
525+
s.on("noArgs", (...args) => {
526+
expectType<[]>(args);
527+
done();
528+
});
509529
s.on("helloFromClient", (message) => {
510530
expectType<string>(message);
511531
done();
@@ -526,6 +546,10 @@ describe("server", () => {
526546
const sio = new Server<ClientToServerEvents, ServerToClientEvents>(srv);
527547
srv.listen(() => {
528548
sio.on("connection", (s) => {
549+
// @ts-expect-error - shouldn't accept emit events
550+
s.on("noArgs", (message, number) => {
551+
done();
552+
});
529553
// @ts-expect-error - shouldn't accept emit events
530554
s.on("helloFromServer", (message, number) => {
531555
done();
@@ -538,14 +562,17 @@ describe("server", () => {
538562

539563
describe("listen and emit event maps for the serverSideEmit method", () => {
540564
interface ClientToServerEvents {
565+
noArgs: () => void;
541566
helloFromClient: (message: string) => void;
542567
}
543568

544569
interface ServerToClientEvents {
570+
noArgs: () => void;
545571
helloFromServer: (message: string, x: number) => void;
546572
}
547573

548574
interface InterServerEvents {
575+
noArgs: () => void;
549576
helloFromServerToServer: (message: string, x: number) => void;
550577
ackFromServerToServer: (foo: string, cb: (bar: number) => void) => void;
551578
}
@@ -563,20 +590,29 @@ describe("server", () => {
563590
Server<ClientToServerEvents, ServerToClientEvents, InterServerEvents>
564591
>(sio);
565592
srv.listen(async () => {
593+
sio.serverSideEmit("noArgs");
566594
sio.serverSideEmit("helloFromServerToServer", "hello", 10);
567595
sio
568596
.of("/test")
569597
.serverSideEmit("helloFromServerToServer", "hello", 10);
570598

599+
sio.on("noArgs", (...args) => {
600+
expectType<[]>(args);
601+
});
571602
sio.on("helloFromServerToServer", (message, x) => {
572603
expectType<string>(message);
573604
expectType<number>(x);
574605
});
606+
sio.of("/test").on("noArgs", (...args) => {
607+
expectType<[]>(args);
608+
});
575609
sio.of("/test").on("helloFromServerToServer", (message, x) => {
576610
expectType<string>(message);
577611
expectType<number>(x);
578612
});
579613

614+
//@ts-expect-error - "helloFromServerToServer" does not have a callback
615+
sio.serverSideEmitWithAck("noArgs");
580616
//@ts-expect-error - "helloFromServerToServer" does not have a callback
581617
sio.serverSideEmitWithAck("helloFromServerToServer", "hello");
582618

0 commit comments

Comments
 (0)