首页 > 解决方案 > socket.io-redis 打字稿错误

问题描述

我尝试@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带有错误的变量处得到了一个红色下划线:

类型“适配器”不可分配给类型“RedisAdapter”。

“适配器”类型中缺少属性“uid”。

谁能帮我解决这个问题?我对打字稿很陌生

标签: typescriptredissocket.iodefinitelytyped

解决方案


这是正确的行为,类型io.of('/').adapterAdapter。事实上,您指定RedisAdapterinterface() 的特定 implementation()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;

推荐阅读