You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 7升级至10后,抽象类调用抽象方法触发TypeError报错

Angular 7升10后报错TypeError: this.formatValue is not a function的解决办法

问题情况

把Angular从7版本升级到10之后,页面完全加载不出来,浏览器控制台抛出错误:TypeError: this.formatValue is not a function。代码里存在一个抽象类InputValue,它的非抽象方法getValue调用了抽象方法formatValue,且继承该抽象类的子类已经实现了formatValue方法:

formatValue(value: any): string | null {
    return [null, void 0, ''].includes(value) ? null : String(value);
}

代码编译正常,但运行时触发上述错误。

问题原因

Angular升级到10时,配套的TypeScript版本也更新到3.9.x,对类继承、方法上下文的检查规则更严格,常见触发原因包括:

  • this上下文丢失:如果getValue被作为回调传递(比如绑定到模板事件、异步操作中),未正确保留this指向,调用时this并非子类实例,导致找不到formatValue方法
  • 继承链异常:中间继承的抽象类错误覆盖了formatValue,或者未正确声明该抽象方法,导致子类的实现未被正确识别
  • 编译配置变更:升级后strictBindCallApply等严格模式配置默认开启,暴露了旧版本未检测到的this上下文问题

解决方案

1. 固定this指向

如果getValue用于模板绑定或回调场景,通过两种方式确保this指向子类实例:

  • 构造函数内绑定:
constructor() {
    this.getValue = this.getValue.bind(this);
}
  • 箭头函数定义getValue(无需子类重写该方法时适用):
getValue = () => {
    // 原有逻辑,调用this.formatValue
    return this.formatValue(someValue);
}

2. 检查继承链的方法声明

确认中间抽象子类的formatValue处理正确:若中间类为抽象类,要么实现该方法,要么继续声明为抽象方法:

abstract class MiddleInput extends InputValue {
    abstract formatValue(value: any): string | null;
}

3. 临时调整编译配置(不推荐长期使用)

若为严格模式触发的问题,可在tsconfig.json中临时关闭相关配置(建议优先修复代码):

{
    "compilerOptions": {
        "strictBindCallApply": false
    }
}

验证方法

修改后重新编译运行项目,检查浏览器控制台是否仍有错误,确认页面正常加载。

内容的提问来源于stack exchange,提问作者George Salukvadze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:12:46