Javascript 在事件处理程序中使用另一个类的方法并绑定当前类上下文时出现typescript错误TS2339
我有一个名为Javascript 在事件处理程序中使用另一个类的方法并绑定当前类上下文时出现typescript错误TS2339,javascript,angular,typescript,ecmascript-6,Javascript,Angular,Typescript,Ecmascript 6,我有一个名为DomService 我有另一个服务处理模式功能,名为ModalService 在ModalService中,我绑定了一些事件,并将DomService中的方法作为侦听器提供给它,如下所示: document.body.addEventListener('focus',this.domService.keyPress.bind(this),true) 然后按键看起来像: keyPress(event){ if (event.which === key.escape) {
DomService
我有另一个服务处理模式功能,名为ModalService
在ModalService
中,我绑定了一些事件,并将DomService
中的方法作为侦听器提供给它,如下所示:
document.body.addEventListener('focus',this.domService.keyPress.bind(this),true)代码>
然后按键看起来像:
keyPress(event){
if (event.which === key.escape) {
event.preventDefault();
this.hide();
}
}
它工作得很好,问题是typescript在实际绑定到ModalService
类时,仍然将this
视为对DomService
类的引用,因此它告诉我类型DomService
上不存在hide
属性
我能做些什么让typescript冷静下来吗?试着把你的函数改成箭头函数
改变
keyPress(event) {
到
您可以阅读typescript中的箭头函数尝试将函数更改为箭头函数
改变
keyPress(event) {
到
您可以阅读typescript中的箭头函数您可以通过将它(及其类型)作为第一个参数添加到函数中来更改任何函数中该
的上下文。因此,要将内的此
的上下文更改为ModalService
,您可以执行以下操作:
keyPress(this: ModalService, event) {
if (event.which === key.escape) {
event.preventDefault();
this.hide(); // Now is OK.
}
}
您可以阅读有关该功能的更多信息
除此之外,如果上述解决方案不充分,您始终可以在任何创建错误的行上方添加一行/@ts ignore
,以使其静音。您可以在任何函数中通过将其(及其类型)添加为函数的第一个参数来更改此的上下文。因此,要将内的此
的上下文更改为ModalService
,您可以执行以下操作:
keyPress(this: ModalService, event) {
if (event.which === key.escape) {
event.preventDefault();
this.hide(); // Now is OK.
}
}
您可以阅读有关该功能的更多信息
除此之外,如果上述解决方案不足,您可以始终在任何创建错误的行上方添加一行/@ts ignore
,以使其静音。您可以使用并处理(订阅)“发出”事件
ModalService
this.subscriptionHide = this.domService.getHideEmitter()
.subscribe(() => this.hide());
hideEmitter: EventEmitter<any> = new EventEmitter();
keyPress(event){
if (event.which === key.escape) {
event.preventDefault();
this.hideEmitter.emit(null);
}
}
getHideEmitter() {
return this.hideEmitter;
}
DomService
this.subscriptionHide = this.domService.getHideEmitter()
.subscribe(() => this.hide());
hideEmitter: EventEmitter<any> = new EventEmitter();
keyPress(event){
if (event.which === key.escape) {
event.preventDefault();
this.hideEmitter.emit(null);
}
}
getHideEmitter() {
return this.hideEmitter;
}
hideEmitter:EventEmitter=neweventemitter();
按键(事件){
if(event.which==key.escape){
event.preventDefault();
this.hideEmitter.emit(null);
}
}
getHideEmitter(){
返回此.hideEmitter;
}
您可以使用和处理(订阅)“发出”事件
ModalService
this.subscriptionHide = this.domService.getHideEmitter()
.subscribe(() => this.hide());
hideEmitter: EventEmitter<any> = new EventEmitter();
keyPress(event){
if (event.which === key.escape) {
event.preventDefault();
this.hideEmitter.emit(null);
}
}
getHideEmitter() {
return this.hideEmitter;
}
DomService
this.subscriptionHide = this.domService.getHideEmitter()
.subscribe(() => this.hide());
hideEmitter: EventEmitter<any> = new EventEmitter();
keyPress(event){
if (event.which === key.escape) {
event.preventDefault();
this.hideEmitter.emit(null);
}
}
getHideEmitter() {
return this.hideEmitter;
}
hideEmitter:EventEmitter=neweventemitter();
按键(事件){
if(event.which==key.escape){
event.preventDefault();
this.hideEmitter.emit(null);
}
}
getHideEmitter(){
返回此.hideEmitter;
}
哪个此
被视为DomService
?按键中的那一个
还是addEventListener中的那一个
?编辑:没关系,我明白你的意思。此外,如果您所寻找的只是一种消除typescript错误的方法,那么总是会有值得信赖的/@ts ignore
注释。我们可以停在行,我有一个服务可以处理我所有的dom操作。不要这样做,我们应该避免在Angular中直接进行DOM操作。此外,如果您知道this
始终是对ModalService
的引用,您可以将签名更改为:keyPress(this:ModalService,event){…}
(请注意,使用此
作为第一个参数仅用作类型注释,它不会在输出中显示为参数)@Alex我不认为我需要添加太多细节,但DomService主要通过resolveComponentFactory创建动态元素。你可以在这里阅读更多信息:@Kolby当然,我现在明白了。我立即根据那条评论得出结论:p这被视为DomService
内部按键
或addEventListener
中的一个?编辑:无所谓我明白你的意思。此外,如果你想要的只是一种消除类型脚本错误的方法,那么总是有可靠的/@ts ignore
注释。我们可以停在行。我有一个服务可以处理我所有的dom操作
。不要t、 我们应该避免在Angular中直接进行DOM操作。此外,如果您知道this
始终是对ModalService
的引用,您可以将签名更改为:keyPress(this:ModalService,event){…}
(请注意,使用此
作为第一个参数仅用作类型注释,它不会在输出中显示为参数)@Alex我不认为我需要添加太多细节,但DomService主要通过resolveComponentFactory创建动态元素。你可以在这里阅读更多信息:@Kolby当然,我现在明白了。我立即得出结论,仅仅基于这一评论:PI希望它具有ModalService的上下文。它有一个hide
我需要调用的方法。不过我希望它具有ModalService的上下文。它有一个我需要调用的hide
方法。