如何键入定义绑定 this

How to type define a bound this

我正在使用一个 library with a function,它接受一个 callback,然后(令人沮丧地)调用 callback = (callback || noop).bind(this)。在 callback 中,我需要抓取 this:

    kurento_utils.WebRtcPeer.WebRtcPeerSendonly(options, function (error: any) {
        if ( error ) {
            return on_error(error);
        }
        let webRTC_peer = this;  // kurento_utils binds 'this' to the callback
                       // ^^^^ error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation. 

        webRTC_peer.generateOffer((error: string | undefined, offer: string) => {

...

TypeScript 对这种情况(可以理解)感到不满,至少在 noImplicitThis 标志启用时是这样。

我不知道如何正确输入注释 this

您可以向函数添加一个 this 参数。此参数不会发送到 Javscript,而只是为了编译器的利益,以便它可以正确键入 this witing 函数:

 kurento_utils.WebRtcPeer.WebRtcPeerSendonly(options, function (this:WebRtcPeer, error: any) {
      let webRTC_peer = this; // this will be of type WebRtcPeer
 }      

或者,如果您还控制 WebRtcPeerSendonly,您可以指定它作为参数的函数将有一个特定的 this 传递给它并且类型推断将适用于 this与任何其他参数一样:

class WebRtcPeer {
    WebRtcPeerSendonly(options: any, fn: (this: WebRtcPeer, error: any) => void) {

    }
}

new WebRtcPeer().WebRtcPeerSendonly({}, function(error){
    let webRTC_peer = this; // this will be of type WebRtcPeer
})