gpt4 book ai didi

typescript - 声明与某些基类属性同名的属性

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:18 24 4
gpt4 key购买 nike

我正在扩展一个模块,我注意到当我声明一些private 属性时,例如方法init(),出现了这个错误:

Types have separate declarations of a private property 'init'

我知道造成这种情况的原因是我在父类(super class)中有一个相同方法,但我不想调用不同的名称只是因为那个已经在一个类中我什至不能访问它,因为它是私有(private)的!

我把这个方法声明为私有(private)的,正是为了避免这种事情。我不想覆盖它,但这不应该阻止我在另一个类中再次声明它。这有什么意义呢?

最佳答案

我认为这是因为 javascript 的原型(prototype)性质。
考虑以下代码

class A {
public constructor() {
this.method();
}

private method() {
console.log("A");
}
}

class B extends A {
private method() {
console.log("B");
}
}

new B();

您期望的是控制台将显示 "A",因为在类 A 的构造函数中我们调用了私有(private)方法,这意味着它不能被一个类覆盖(为此我们已经保护)。

但是这段代码编译成:

var A = (function () {
function A() {
this.method();
}
A.prototype.method = function () {
console.log("A");
};
return A;
}());
var B = (function (_super) {
__extends(B, _super);
function B() {
_super.apply(this, arguments);
}
B.prototype.method = function () {
console.log("B");
};
return B;
}(A));

( code in playground )

如您所见,B 原型(prototype)中的方法 被新函数覆盖,因此实际上控制台将显示 “B”
这是 protected 而不是 private 的行为,可能正因为如此,它是不允许的。

在我看来,您有 3 个选择:

  • 为私有(private)方法使用不同的名称
  • 将方法从 private 更改为 protected,它会做完全相同的事情,但至少在代码中会清楚地表明是这种情况
  • 为这两个类使用一个只包含公共(public)/保护方法的基类,然后在这两个类中实现私有(private)方法

关于typescript - 声明与某些基类属性同名的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38191733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com