socket.io-redis打字稿错误

socket.io-redis Typescript error

我试过像这样使用 @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 变量处有一条红色下划线,错误为:

Type 'Adapter' is not assignable to type 'RedisAdapter'.

Property 'uid' is missing in type 'Adapter'.

谁能帮我解决这个问题?我对 Typescript 很陌生

尝试使用 as 投射:

const adapter: RedisAdapter = io.of('/').adapter as RedisAdapter;

这是正确的行为,io.of('/').adapter 的类型是 Adapter。事实上,您分配了接口(Adapter)的特定实现(RedisAdapter)不要更改 属性 类型,因为稍后您可能会更改为 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;

我意识到这是一个老问题...但我在阅读文档之前发现了这个 post:-)

根据 @socket.io/redis-adapter 的 v6 文档,您应该导入 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));