Из документов :
Защищенный модификатор действует во многом как закрытый модификатор, за исключением того, что члены, объявленные защищенными , также доступны в производных классах .
В вышеприведенном случае вы используете protectedData
в качестве метода из параметра функции anInstanceOfA
, который имеет базовый тип A
. Но вы не имеете доступа к protectedData
в производном классе B
по this.protectedData()
, поэтому TS кричит здесь. Что работает, а что нет:
class B extends A {
public extractTest(anInstanceOfA: A, instanceOfB: B): string {
anInstanceOfA.protectedData() // ✖, protected member of arg with base class
instanceOfB.protectedData() // ✔, protected member of arg with *same* class
this.protectedData(); // ✔, (derived) protected member via `this`
return anInstanceOfA["protectedData"]() // escape-hatch with dynamic property access
}
}
Таким образом, вы можете либо объявить protectedData
как public
, либо использовать escape-люк, который сделает protected
членов доступными через динамический c доступ к свойству с помощью Обозначение в скобках.
anInstanceOfA["protectedData"]()
Пример игровой площадки, чтобы попробовать его