不是很懂为什么这个 WebSocket 事件赋值的时候,可以忽略第一个参数?

2021-04-19 17:48:33 +08:00
 yazoox

看到这样一段代码(节选)

这里是定义部分

export interface BaseWebSocket {
  onopen: ((this: WebSocket, ev: Event) => any) | null;
}

class MyWebSocket implements BaseWebSocket {
  webSocket?: WebSocket;
  onopen: ((this: WebSocket, ev: Event) => any) | null = null;

  connect(url: string): void {
    this.webSocket = new WebSocket(url);
    this.webSocket.onopen = this.onopen;
  }
}


然后,再下面某个函数里面,再创建该 class 的实例,并调用给这个实例的 onopen 添加实现的时候,只有一个“参数”。

(blabla...)
    const webSocket = webSocketIn ? webSocketIn : new MyWebSocket();

    webSocket.onopen = _event => {
      // 具体的实现代码,这里,这个 arrow function 只有一个参数
      // 但是,onopen 的接口定义,是两个参数
      // 第一个参数,this: WebSocket 为什么可以忽略?还是...... 
    }
    
    (blabla...)
    webSocket.connect("url here...")

google 了一下,没有找到答案,估计是我搜索关键字不对......

1079 次点击
所在节点    TypeScript
3 条回复
EPr2hh6LADQWqRVH
2021-04-19 17:51:19 +08:00
因为 this 不是参数,它只管标注,编译成 js 的时候没这个参数。
anguiao
2021-04-19 18:18:44 +08:00
这里的“this”不是真正的参数,参数只有“ev”一个。
之所以这么写,是为了保证方法的调用者是 WebSocket 类型的,避免 this 指向问题。
TS 的 handbook 里有写,https://www.typescriptlang.org/docs/handbook/2/classes.html#this-parameters
yazoox
2021-04-20 16:28:06 +08:00
@anguiao
好吧,用 typescript this parameter 就能够搜索到。可惜我一直用 javascript this parameter,到处 都是解释 this 的.....
thx.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/771730

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX