Javascript 类别';B';错误地扩展基类';A';(两个命名相同的私有方法)

Javascript 类别';B';错误地扩展基类';A';(两个命名相同的私有方法),javascript,typescript,Javascript,Typescript,我发现了错误 类“B”错误地扩展了基类“A”。 类型具有私有属性“方法”的单独声明 当类A中的方法被注释掉时,错误就会消失。如果有两个命名相同的私有方法,我该怎么办?因为Typescript位于Javscript之上,Javascript不允许继承的类对一个函数有不同的私有实现(所有函数都将在类的原型上结束)Typescript不允许您这样做是有道理的 如果允许这样做,您基本上将覆盖私有成员方法,并且由于它被标记为私有,因此可能不打算用于公共消费/覆盖 如果将函数声明为public/protec

我发现了错误

类“B”错误地扩展了基类“A”。
类型具有私有属性“方法”的单独声明


当类
A
中的方法被注释掉时,错误就会消失。如果有两个命名相同的私有方法,我该怎么办?

因为Typescript位于Javscript之上,Javascript不允许继承的类对一个函数有不同的私有实现(所有函数都将在类的
原型上结束)Typescript不允许您这样做是有道理的

如果允许这样做,您基本上将覆盖私有成员
方法
,并且由于它被标记为私有,因此可能不打算用于公共消费/覆盖

如果将函数声明为public/protected,则可以重写该函数

abstract class A {
    protected method() { }
}

abstract class B extends A {
    protected method() { }
}
或者,如果确实要重写私有方法,可以执行以下操作,尽管私有方法标记为私有是有原因的,最好避免这样做:

class B extends A {

}
(B.prototype as any)['method'] = function(this: B) {
}

这一切都很奇怪,但如果您真的需要,请尝试以下方法:

class Foo {
    private go() {
    }
}

class Bar extends Foo {
    constructor() {
        super();
        this["go"] = this.foo;
    }

    private foo() {

    }
}

用不同的名字命名会有用的。我认为这是可以接受的。如果两者都是公共的,它是有效的。这就是问题所在,只使用typescript,将其转换为纯JavaScript,您可以按照代码的方式完成它,您可以将
A
转换为接口,并将现有的
A.method
移动到一个实现
A
的新抽象类中,如何使两个私有方法的名称相同?
-当从一个类扩展另一个类时,不能让两个私有方法的名称相同,如本文所述-所有方法都是公共的,因此可能重复无论如何编译后,TypeScript允许使用相同的公共方法,为什么它不支持相同的私有方法呢?不管怎样,它们最终还是会公开的…@GetOffMyLawn您可以使用TypeScript游乐场查看JavaScript以及为什么它不可能@GetOffMyLawn-Well-TypeScript不允许您在JS中做很多事情。这里的理由是,标记为private的方法是基类的实现细节,您甚至不应该知道它,更不用说重写了it@GetOffMyLawn由于该方法是私有的,您可能会在不知道的情况下重写它,如果确实,确实希望,但至少不会错误地覆盖私有实现细节。。
class Foo {
    private go() {
    }
}

class Bar extends Foo {
    constructor() {
        super();
        this["go"] = this.foo;
    }

    private foo() {

    }
}