Javascript Typescript:从扩展类调用super方法会产生类型错误-(中间值)不是函数

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(“基类符号单元格失去焦点”); //实施。。。 }这是一个棘手的问题,但它与类中使用箭头函数语法和原型链有关

我正在一个名为StructureWindowComponent的组件中实现事件处理,并且在LeggerStructureWindowComponent中也有一个覆盖

在基类(StructureWindowComponent)中,blur事件的事件处理如下所示:

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,我有