【问题标题】:Uncaught TypeError: Super expression must either be null or a function when create child class in parent未捕获的类型错误:在父类中创建子类时,超级表达式必须为 null 或函数
【发布时间】:2021-02-12 14:58:46
【问题描述】:

有 2 个类(抽象类和具体类)。 抽象的创造具体的(我知道这不是最好的主意,但只是举例)。在其他语言中它可以完美运行,但在 javascript 中却不行。我做错了什么吗?

import {Archer} from "@/Entities/Army/Individual/Archer";

export abstract class Unit {
    public abstract bombardStrength(): number;

    public abstract defensiveStrength(): number;

    public getComposite(): void {
        console.log(new Archer());
    }
}

import {Unit} from "@/Entities/Army/Unit";

export class Archer extends Unit {
    bombardStrength(): number {
        return 40;
    }

    defensiveStrength(): number {
        return 35;
    }
}

为什么 js 会因为这个错误而崩溃?

【问题讨论】:

    标签: javascript typescript vue.js vuejs2 typeerror


    【解决方案1】:

    你不能在父类文件中导入子类,因为导入会导致类声明,但两者都还没有声明。

    您需要将getCompositeUnit 取出到一个单独的文件中。

    【讨论】:

    • 这真是奇怪的行为。在其他语言中这样做完全没问题。
    【解决方案2】:

    实现抽象类的类必须在构造函数中调用 super()。这就是 typescript 中抽象类的工作原理。

    import {Unit} from "@/Entities/Army/Unit";
    
    export class Archer extends Unit {
     constructor(){
     super();    
    }
    bombardStrength(): number {
        return 40;
    }
    
    defensiveStrength(): number {
        return 35;
    }
    }
    

    这应该可以正常工作。

    【讨论】:

    • 这不是必须的。如果省略构造函数,将添加一个自动调用 super()
    • 没有帮助
    猜你喜欢
    • 2017-04-01
    • 1970-01-01
    • 2021-06-11
    • 2016-09-23
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多