我如何在打字稿中强类型 socketIO 服务器

how do I strongly type socketIO server in typescript

如何强类型私有 属性 private io 以阻止 Typescript 抛出此错误 属性 'io' 没有初始化程序并且不是在构造函数中明确赋值

import fastify, { FastifyReply, FastifyRequest } from "fastify";
import socketIO from "socket.io";
import fastifysocketIO from "fastify-socket.io";
import fastifyStatic from "fastify-static";
import path from "path"



class App {
    private server;
    private port: number;
    private io: socketIO.Server;

    constructor(port: number) {
        this.server = fastify({ logger: true });
        this.port = port;
        this.server.register(fastifyStatic, {

            root: path.join(__dirname, "../public"),
        });
        this.server.register(fastifysocketIO, ({
            cors: { origin: "*" }
        }));

        this.server.ready(err => {
            if (err) { throw err }
            this.io = this.server.io;

            this.io.on('connect', (socket: socketIO.Socket) => {
                return console.info('Socket connected!', socket.id);
            })
        });

        this.server.get("/", (request: FastifyRequest, reply: FastifyReply) => {
            reply.sendFile("chat.html");
        })
    }
    public start() {
        this.server.listen(this.port);

    }
}
new App(3000).start();

您正在回调中设置 .io,可能是在服务器启动之后。您有 3 个选项:

忽略错误

如果您将 属性 指定为:

private io!: socketIO.Server;

它告诉 Typescript:我知道我在构造期间没有设置这个 属性,但是“相信我没问题”。

但提醒一下,在构建 App class 和 this.io 未定义的就绪回调之间有一小段 window。

准确输入

您可以将定义更改为:

private io: socketIO.Server | null = null;

这会强制每次使用 this.io 时首先确保它已初始化。

施工前一切就绪。

简而言之,您还可以在 class 之外构造您的 Server 和 IO 对象,并将其作为参数传递给构造函数。

这更像是一种主观观察,但我看到很多人在编写 Javascript 时,他们来自其他编程语言,那里有 classes 的一切(比如 Java =] 和 PHP),即使没有必要。

类 应该在 Java 脚本中谨慎使用,并且应该有目的。如果他们有这样的 'evolving state',他们通常更难用 Typescript 打字。

如果这是你的全部class,我个人认为这与class无关。