我试过像这样使用@types/socket.io-redis:
import { Server as HttpServer } from 'http';
import socketIo, { Socket } from 'socket.io';
import redis, { RedisAdapter } from 'socket.io-redis';
export default function setupWebsocket(server: HttpServer) {
const io = socketIo().listen(server);
io.adapter(redis(process.env.REDIS_URL));
const adapter: RedisAdapter = io.of('/').adapter; // Error here
}在这里的错误注释所在的部分,我在adapter变量的红色下划线上显示了错误:
输入“Adapter”不能指定键入“RedisAdapter”。 属性“uid”在“Adapter”类型中缺失。
有人能帮我解决这个问题吗?我对打字很陌生
发布于 2018-07-23 10:51:40
这是正确的行为,io.of('/').adapter的类型是Adapter。您分配了接口(Adapter)的特定实现(Adapter)这一事实不会更改属性类型,因为稍后您可能会更改为Adapter的不同实现。
可能的解决方案可能是在创建之后直接分配适配器。
import { Server as HttpServer } from 'http';
import socketIo, { Socket } from 'socket.io';
import redis, { RedisAdapter } from 'socket.io-redis';
export default function setupWebsocket(server: HttpServer) {
const io = socketIo().listen(server);
const adapter: RedisAdapter = redis(process.env.REDIS_URL);
io.adapter(adapter);
//... more code here
}其他解决方案是将其转换为所需的类型。
const adapter: RedisAdapter = io.of('/').adapter as RedisAdapter;发布于 2018-07-23 10:23:13
尝试使用as进行铸造
const adapter: RedisAdapter = io.of('/').adapter as RedisAdapter;发布于 2021-08-19 04:09:39
我知道这是个老问题..。但我在阅读文档之前找到了这篇文章:-)
根据v6 of @socket.io/redis-adapter的文档,您应该导入createAdapter函数来初始化适配器。
https://github.com/socketio/socket.io-redis-adapter#typescript
import { Server } from 'socket.io';
import { createAdapter } from '@socket.io/redis-adapter';
import { RedisClient } from 'redis';
const io = new Server(8080);
const pubClient = new RedisClient({ host: 'localhost', port: 6379 });
const subClient = pubClient.duplicate();
io.adapter(createAdapter(pubClient, subClient));https://stackoverflow.com/questions/51476126
复制相似问题