typescript 套接字.io-redis打字错误

nwwlzxa7  于 2023-03-13  发布在  TypeScript
关注(0)|答案(4)|浏览(133)

我试着像这样使用@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
}

Error here 注解所在的部分,我在adapter变量上看到了红色下划线,错误如下:
类型“Adapter”不能分配给类型“RedisAdapter”。
类型“Adapter”中缺少属性“uid”。
有人能帮我解决这个问题吗?我对Typescript很陌生

1aaf6o9v

1aaf6o9v1#

这是正确的行为,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;
bfrts1fy

bfrts1fy2#

尝试使用as进行铸造:

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

pkwftd7m3#

我知道这是一个老问题...但我在阅读文档之前找到了这个帖子:-)
根据@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));
jxct1oxe

jxct1oxe4#

请使用此版本socket.io,此问题与socket.io@4.6的较新版本有关

相关问题