我如何在打字稿中强类型 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无关。
如何强类型私有 属性 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无关。