看到这样一段代码(节选)
这里是定义部分
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 了一下,没有找到答案,估计是我搜索关键字不对......
1
EPr2hh6LADQWqRVH 2021-04-19 17:51:19 +08:00
因为 this 不是参数,它只管标注,编译成 js 的时候没这个参数。
|
2
anguiao 2021-04-19 18:18:44 +08:00 via Android 1
这里的“this”不是真正的参数,参数只有“ev”一个。
之所以这么写,是为了保证方法的调用者是 WebSocket 类型的,避免 this 指向问题。 TS 的 handbook 里有写,https://www.typescriptlang.org/docs/handbook/2/classes.html#this-parameters 。 |