javascript 用prototype调用抽象方法

ukdjmx9f  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(91)

我有一个带有抽象方法的抽象类。我发现如果我用prototypecall调用方法,Typescript不会抛出任何错误。例如:

abstract class Human{
    age: string;
    constructor(age: string){
        this.age = age;
    }
    abstract name(): void
}

class Human1 extends Human{
    constructor(age: string){
        super(age);
        this.name()
        
    }
name(): void {
    Human.prototype.name.call(this); // this is allowed despite that name is undefined/abstract
    let a = "do something";
    }
}

let a = new Human1("23")

有没有办法让Typescript在这里抛出错误?

zf9nrax1

zf9nrax11#

我发现,如果我用prototypecall调用该方法,Typescript不会抛出任何错误。
是的,TypeScript在输入原型对象方面非常糟糕。它认为Human.prototype的类型为Human 1,因此它只考虑公共接口。abstract修饰符只影响子类实现。
有没有办法让Typescript在这里抛出错误?
是的,不要使用.call来调用父方法。有super关键字:

name(): void {
    super.name(); // this errors
    let a = "do something";
}

(Playground演示)
这不会编译,但会像预期的那样抛出错误“Abstract method 'name' in class 'Human' cannot be accessed via super expression.(ts 2513)”。
1:还请注意,它认为Human.prototype.age是一个数字,Human.prototype.constructor是任何Function,而不是typeof Human

相关问题