【问题标题】:Typescript filter no signatures打字稿过滤器没有签名
【发布时间】:2022-12-05 17:43:42
【问题描述】:

我有一个打字稿错误,说 .filter 没有签名。我不知道如何解决这个问题

interface IDevice {
    deviceId: string;
    deviceName?: string;
}

const joinRoom = ({ userId, deviceId, deviceName }: IRoomParams) => {
  rooms[userId] = rooms[userId]?.filter((id) => id !== deviceId);
})

更新:下面我添加了我所有的界面和加入房间的完整功能。我不确定如何构造我的类型,以便在设备断开连接时我可以使用 .filter 从列表中远程设备

const rooms: Record<string, Record<string, IDevice>> = {};
interface IDevice {
    deviceId: string;
    deviceName?: string;
}
interface IRoomParams extends IDevice {
    userId: string;
}

interface ISendRequestParams {
    userId: string;
    options: any;
    requestId: string;
}

interface IReturnRequestParams {
    userId: string;
    data: any;
    requestId: string;
    error: any;
}

const joinRoom = ({ userId, deviceId, deviceName }: IRoomParams) => {
    if (!rooms[userId]) rooms[userId] = {};
    // console.log('device joined the room', userId, deviceId, deviceName);
    rooms[userId][deviceId] = { deviceId, deviceName };
    socket.join(userId);
    
    io.sockets.to(userId).emit('get-devices', {
        userId,
        participants: rooms[userId]
    });

    socket.on('disconnect', () => {
        console.log(`user left the room: roomId[${userId}], device[${deviceId}], deviceName[${deviceName}]`);
        rooms[userId] = rooms[userId]?.filter((id) => id !== deviceId);
        socket.to(userId).emit('device-disconnected', deviceName);
    });
};

错误: 此表达式不可调用。 类型 'IDevice' 没有调用 signatures.ts(2349)

【问题讨论】:

  • rooms 的类型是什么?什么是IRoomParams如果我们假设 IRoomParams 中的 deviceIdIDevice 中的一样是 string,代码的编写使得 rooms[userId] 需要具有类型 undefined | string[](或 null | string[],或全部三种) .可以?
  • 你能提供更多代码吗?什么是房间(及其类型)? IRoomParams 是什么?当您在对象而不是数组上使用 .filter 时,通常会发生此错误
  • 当询问错误消息时,请务必将完整的错误消息复制并粘贴到问题中。只是“没有签名”并不能真正告诉我们太多(某物, 但并不多)。
  • 我更新了问题以反映加入房间的完整功能和完整的错误消息
  • 感谢那! rooms[userId]的类型是undefined | Record&lt;string, IDevice&gt;,不是@Paul-Marie说的数组类型。您使用 filter数组,不是简单的对象。

标签: typescript


【解决方案1】:

如果你想消除deviceIduserId 关联的设备记录(字典)中的 deviceId,您可以只使用 delete 关键字:

delete rooms[userId][deviceId];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 2015-06-23
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2021-05-20
    相关资源
    最近更新 更多