TypeScript
Начиная с версии v3, Socket.IO теперь имеет поддержку типов TypeScript.
Типы для сервера
Сначала объявите некоторые типы:
interface ServerToClientEvents {
noArg: () => void;
basicEmit: (a: number, b: string, c: Buffer) => void;
withAck: (d: string, callback: (e: number) => void) => void;
}
interface ClientToServerEvents {
hello: () => void;
}
interface InterServerEvents {
ping: () => void;
}
interface SocketData {
name: string;
age: number;
}
И используйте их при создании вашего сервера:
const io = new Server<ClientToServerEvents, ServerToClientEvents, InterServerEvents, SocketData>();
Затем используйте помощь вашей IDE!
События, объявленные в интерфейсе ServerToClientEvents используются при отправке и трансляции событий:
io.on("connection", (socket) => {
socket.emit("noArg");
socket.emit("basicEmit", 1, "2", Buffer.from([3]));
socket.emit("withAck", "4", (e) => {
// e is inferred as number
});
// works when broadcast to all
io.emit("noArg");
// works when broadcasting to a room
io.to("room1").emit("basicEmit", 1, "2", Buffer.from([3]));
});
Те, которые объявлены в интерфейсе ClientToServerEvents используются при получении событий:
io.on("connection", (socket) => {
socket.on("hello", () => {
// ...
});
});
Те, которые объявлены в интерфейсе InterServerEvents используются для межсерверной связи (добавлены в socket.io@4.1.0):
io.serverSideEmit("ping");
io.on("ping", () => {
// ...
});
И, наконец, тип SocketData используется для типизации атрибута socket.data (добавлен в socket.io@4.4.0):
io.on("connection", (socket) => {
socket.data.name = "john";
socket.data.age = 42;
});
Эти подсказки по типам не заменяют правильной валидации/санизации входных данных. Как обычно, никогда не доверяйте входным данным пользователя.
Типы для клиента
На стороне клиента вы можете повторно использовать те же интерфейсы ServerToClientEvents и ClientToServerEvents:
import { io, Socket } from "socket.io-client";
// please note that the types are reversed
const socket: Socket<ServerToClientEvents, ClientToServerEvents> = io();
Аналогично, события, объявленные в интерфейсе ClientToServerEvents используются при отправке событий:
socket.emit("hello");
И те, которые объявлены в ServerToClientEvents используются при получении событий:
socket.on("noArg", () => {
// ...
});
socket.on("basicEmit", (a, b, c) => {
// a is inferred as number, b as string and c as buffer
});
socket.on("withAck", (d, callback) => {
// d is inferred as string and callback as a function that takes a number as argument
});
© 2014–2021 Automattic
Licensed under the MIT License.
https://socket.io/docs/v4/typescript