Javascript WebSocket can';在事件处理程序方法中看不到Typescript类属性

Javascript WebSocket can';在事件处理程序方法中看不到Typescript类属性,javascript,typescript,websocket,Javascript,Typescript,Websocket,形势 我有以下类型脚本文件: PlayerList.ts GameEngineInterface.ts GameEngine.ts 索引 当浏览器连接到此websocket服务器时,将引发此错误 var player=this.playerList.addPlayer(套接字); TypeError:无法读取未定义的属性“addPlayer” 如果我将index.ts中的最后一行更改为 websocketApp.on(“连接”(socket:socket)=>gameEngine.onNewPl

形势

我有以下类型脚本文件:

PlayerList.ts

GameEngineInterface.ts

GameEngine.ts

索引

当浏览器连接到此websocket服务器时,将引发此错误

var player=this.playerList.addPlayer(套接字); TypeError:无法读取未定义的属性“addPlayer”

如果我将index.ts中的最后一行更改为

websocketApp.on(“连接”(socket:socket)=>gameEngine.onNewPlayerConnect(socket))

然后错误消失了

问题

  • 我的代码首先出了什么问题
  • 为什么修复有效

  • 谢谢您抽出时间。

    因为当您通过函数时
    websocketApp.on(“连接”,gameEngine.onNewPlayerConnect)
    
    onNewPlayerConnect
    绑定到websocketApp的方式,因此
    上下文指向它
    在arrow函数中,绑定
    onNewPlayerConnect
    被保留

    在事件处理程序函数中通常绑定到事件源。当您使用点表示法调用函数(而不是事件队列直接调用它)时,您将不同的
    this
    绑定到函数。谢谢@Teemu。我不知道事件处理程序是这样工作的。我认为使用箭头函数看起来不整洁。你有没有建议如何直接在GameEngine.ts文件中进行绑定,这样我就不必在index.ts中使用arrow函数了?这个arrow函数现在还可以。您还可以使用
    bind
    this
    绑定到对象。
    interface GameEngineInterface {
      onNewPlayer(socket: Socket):void
    }
    
    class GameEngine implements GameEngineInterface {
      constructor(private playerList: PlayerList = new PlayerList()){}
      onNewPlayer(socket: Socket) {
        playerList.addPlayer(socket)
      }
    }
    
    const gameEngine: GameEngineInterface = new GameEngine();
    const httpServer = new Http.Server({}).listen(3000);
    const websocketApp = new SocketIO(httpServer);
    
    websocketApp.on("connection", gameEngine.onNewPlayerConnect);