Javascript Typescript:从扩展类调用super方法会产生类型错误-(中间值)不是函数
我正在一个名为StructureWindowComponent的组件中实现事件处理,并且在LeggerStructureWindowComponent中也有一个覆盖 在基类(StructureWindowComponent)中,blur事件的事件处理如下所示:Javascript Typescript:从扩展类调用super方法会产生类型错误-(中间值)不是函数,javascript,angular,typescript,event-handling,super,Javascript,Angular,Typescript,Event Handling,Super,我正在一个名为StructureWindowComponent的组件中实现事件处理,并且在LeggerStructureWindowComponent中也有一个覆盖 在基类(StructureWindowComponent)中,blur事件的事件处理如下所示: symbolCellLostFocus=(symbolField:MatInput,$index:number)=>{ log(“基类符号单元格失去焦点”); //实施。。。 }这是一个棘手的问题,但它与类中使用箭头函数语法和原型链有关
symbolCellLostFocus=(symbolField:MatInput,$index:number)=>{
log(“基类符号单元格失去焦点”);
//实施。。。
}
这是一个棘手的问题,但它与类中使用箭头函数语法和原型链有关。它与角度无关
基本上,如果您想解决问题,您需要将a=()=>{…}
替换为a(){…}
:
symbolCellLostFocus(symbolField:MatInput,$index:number){
log(“基类符号单元格失去焦点”);
//实施。。。
}
symbolCellLostFocus(symbolField:MatInput,$index:number){
log(“派生类符号失去焦点”);
super.symbolCellLostFocus(symbolField,$index);
}
现在来解释一下,如果您编写以下代码段:
A类{
名称='A'
说你好=()=>{
log('Hello from A')
}
}
B类扩展了A类{
名称='B'
说你好=()=>{
log('Hello from B')
super.sayHello()
}
}
将其转换为以下JavaScript代码段:
A类{
构造函数(){
this.name='A';
this.sayHello=()=>{
log('Hello from A');
};
}
}
B类扩展了A类{
构造函数(){
超级(…参数);
this.name='B';
this.sayHello=()=>{
log('Hello from B');
super.sayHello();
};
}
}
如您所见,这些方法是在构造函数中为构造函数创建的每个实例定义的。这意味着A
中的sayHello
方法不适用于B
,因为sayHello
在B
的原型中不可用(即A
),它仅适用于A
的每个实例。这可能会让人困惑,我强烈建议学习JavaScript中的原型继承
ES2015中引入的类只是JavaScript中原型继承的语法糖。类
、构造函数
、超级
等关键字仅抽象编写原型链所需的语法。本质上,它是用JavaScript实现组合和继承的方法,这是一个非常强大的概念
无论如何,当您在这里编写super.X()
时,JavaScript引擎正试图访问原型上的X
方法,而原型并不存在。您将得到对象.getPrototypeOf(this).undefined()
,并且undefined
实际上不是一个函数,因此您将得到类型错误:(中间值)。sayHello不是一个函数运行时错误
这里有一个例子来说明我所说的:。这是一个棘手的问题,但它与类中使用箭头函数语法和原型链有关。它与角度无关
基本上,如果您想解决问题,您需要将a=()=>{…}
替换为a(){…}
:
symbolCellLostFocus(symbolField:MatInput,$index:number){
log(“基类符号单元格失去焦点”);
//实施。。。
}
symbolCellLostFocus(symbolField:MatInput,$index:number){
log(“派生类符号失去焦点”);
super.symbolCellLostFocus(symbolField,$index);
}
现在来解释一下,如果您编写以下代码段:
A类{
名称='A'
说你好=()=>{
log('Hello from A')
}
}
B类扩展了A类{
名称='B'
说你好=()=>{
log('Hello from B')
super.sayHello()
}
}
将其转换为以下JavaScript代码段:
A类{
构造函数(){
this.name='A';
this.sayHello=()=>{
log('Hello from A');
};
}
}
B类扩展了A类{
构造函数(){
超级(…参数);
this.name='B';
this.sayHello=()=>{
log('Hello from B');
super.sayHello();
};
}
}
如您所见,这些方法是在构造函数中为构造函数创建的每个实例定义的。这意味着A
中的sayHello
方法不适用于B
,因为sayHello
在B
的原型中不可用(即A
),它仅适用于A
的每个实例。这可能会让人困惑,我强烈建议学习JavaScript中的原型继承
ES2015中引入的类只是JavaScript中原型继承的语法糖。类
、构造函数
、超级
等关键字仅抽象编写原型链所需的语法。本质上,它是用JavaScript实现组合和继承的方法,这是一个非常强大的概念
无论如何,当您在这里编写super.X()
时,JavaScript引擎正试图访问原型上的X
方法,而原型并不存在。您将得到对象.getPrototypeOf(this).undefined()
,并且undefined
实际上不是一个函数,因此您将得到类型错误:(中间值)。sayHello不是一个函数运行时错误
下面是一个例子来说明我所说的:。我认为您可能需要在右大括号后面添加分号。顺便问一下,你为什么不做这些命名函数呢?Gunnar,我有