Я получил ошибку ввода, которая говорит:
Class 'Foo' incorrectly extends base class 'Baz'.
Types have separate declarations of a private property 'bar'.(2415)
class Bar {}
class Baz {
constructor(private bar: Bar) {}
}
class Foo extends Baz {
constructor(private bar: Bar) {
super(bar);
}
}
Когда я меняю private
на public
, все в порядке, но почему? Почему я не могу использовать private
? Есть ли способ использовать private
? Является ли public
хорошей альтернативой private
?
Просто не переопределяйте свойство в дочернем элементе, оно все еще может быть параметром конструктора: tsplay.dev/mZroJm. Что касается остальной части вашего вопроса, я согласен с комментарием выше, что такое "хорошая альтернатива" полностью зависит от того, чего вы на самом деле пытаетесь достичь.
Итак, начнем с ввода «расширенной» версии того, что вы написали:
class Bar {}
class Baz {
private bar: Bar;
constructor(bar: Bar) {
this.bar = bar;
}
}
class Foo extends Baz {
private bar: Bar;
constructor(bar: Bar) {
this.bar = bar;
super(bar);
}
}
Как видите, вы определяете закрытый атрибут с одинаковым именем как в родительском, так и в дочернем классе. То, что вы хотите сделать, вероятно, это:
class Bar {}
class Baz {
protected bar: Bar;
constructor(bar: Bar) {
this.bar = bar;
}
}
class Foo extends Baz {
constructor(bar: Bar) {
super(bar);
}
}
Это использование «короткой» версии стало:
class Bar {}
class Baz {
constructor(protected bar: Bar) {}
}
class Foo extends Baz {
constructor(bar: Bar) {
super(bar);
}
}
«Когда я меняю частное на общедоступное, все в порядке. но почему?», потому что подклассы могут иметь те же частные свойства, что и суперкласс. "публичный - хорошая альтернатива приватному?" вы хотите, чтобы ваш объект был общедоступным или нет? И если вы хотите, чтобы он был виден только внутри иерархии, а не снаружи, то почему бы и нет
protected
? Какова общая цель здесь?