typescript 在socket.io类型脚本中保存www.example.com对象的更多数据

rkttyhzu  于 2023-01-02  发布在  TypeScript
关注(0)|答案(5)|浏览(151)

我通常在不使用typescript的时候做socket.username = username这样的事情,但是现在我用了,当我试图用同样的方式保存它的时候,它会给我错误

Property 'username' does not exist on type 'Socket'

我知道这意味着我需要延长它,但我已经尝试过这样做

interface Socket {
        username: any
}

但是没有用,我也试过这个,

interface SocketIO {
        username: any
}

但运气不好。

pbpqsu0x

pbpqsu0x1#

只要socket['username'] = username就可以了。
如果希望类型安全并且希望username属性具有自动完成功能,则可以扩展Socket接口。

interface ExtendedSocket extends Socket {
  username: string;
}

然后可以将原始的Socket强制转换为自定义类型:

const mySocket = <ExtendedSocket>socket;
mySocket.username = 'user1'; // won't throw errors and autocomplete will work
nfg76nw0

nfg76nw02#

如果要向套接字对象添加额外信息,可以将此信息添加到**socket.data**对象,该对象在其声明文件中使用any声明
以下是socket.d.ts文件的片段

/**
* Additional information that can be attached to the Socket instance and which will be used in the fetchSockets method
*/
data: any;
erhoui1w

erhoui1w3#

更一般的方式

只需像这样更新模块声明:

declare module 'socket.io' {
    interface Socket {
        username: string
    }
}

现在您可以使用w/o任意类型转换:

socket.username = 'Bob'
uqzxnwby

uqzxnwby4#

这似乎接受socket.username="John"

declare global {
  namespace SocketIO {
    interface Socket {
      username: any
    }
  }
}

但是一个更好的解决方案(恕我直言)是将套接字接口扩展到您自己的套接字:

interface ExtSocket extends SocketIO.Socket 
{
  username: string;
}

然后将套接字本身声明为socket:ExtSocket;或使用一个难看的类型转换:
(socket as ExtSocket).username = "John";

k2arahey

k2arahey5#

您可以向**socket.data添加属性,并将首选的data**类型传递给Socket

import { Socket } from 'socket.io';

interface MyData {
  name: string;
  age: number
}

type ClientSocket = Socket<undefined, undefined, undefined, MyData>;

function handleEvent(socket:ClientSocket){
  # autocomplete works
  socket.data.age = 10
}

相关问题