В TypeScript концепция защищенных свойств и производных классов играет решающую роль в создании надежного и удобного в обслуживании кода. Однако иногда вы можете столкнуться с сообщением об ошибке, например: «Свойство «internalRepr» защищено, но тип «Метаданные» не является классом, производным от «Метаданных». В этой статье мы углубимся в причины этой ошибки и рассмотрим различные способы ее устранения.
Пояснения к ошибке:
Сообщение об ошибке указывает на несоответствие между модификатором доступа и отношениями наследования. Свойство InternalRepr объявлено как защищенное в базовом классе «Метаданные», что указывает на то, что доступ к нему возможен только внутри класса или его производных классов. Однако тип «Метаданные», используемый в коде, не является производным от базового класса «Метаданные», что приводит к несоответствию типов.
Методы устранения ошибки:
Метод 1. Получение класса из базового класса
Самое простое решение – убедиться, что класс “Метаданные” является производным от базового класса “Метаданные”. Таким образом, защищенное свойство “internalRepr” будет иметь вид доступен внутри производного класса.
class Metadata {
protected internalRepr: string;
}
class DerivedMetadata extends Metadata {
// Additional code for the derived class
}
const instance = new DerivedMetadata();
instance.internalRepr = 'Accessing protected property';
Метод 2: использование утверждения типа
Если изменить иерархию классов невозможно, вы можете использовать утверждение типа, чтобы явно привести тип переменной к базовому классу. Таким образом, вы можете получить доступ к защищенному свойству InternalRepr.
class Metadata {
protected internalRepr: string;
}
const instance: Metadata = {} as Metadata;
instance.internalRepr = 'Accessing protected property';
Метод 3: предоставление общедоступного метода получения/установки
Другой подход заключается в предоставлении общедоступного метода получения и установки для защищенного свойства. Таким образом, вы можете инкапсулировать доступ к свойству внутри методов, сохраняя при этом защищенный характер свойства.
class Metadata {
protected _internalRepr: string;
get internalRepr(): string {
return this._internalRepr;
}
set internalRepr(value: string) {
this._internalRepr = value;
}
}
const instance = new Metadata();
instance.internalRepr = 'Accessing protected property';
Понимание защищенных свойств и производных классов в TypeScript необходимо для создания надежного и удобного в обслуживании кода. При появлении сообщения об ошибке типа «Свойство «internalRepr» защищено, но тип «Метаданные» не является классом, производным от «Метаданных», вы можете устранить эту проблему, производя класс от базового класса, используя утверждения типа или предоставляя общедоступные геттеры. и сеттеры. Используя эти методы, вы можете обеспечить правильную инкапсуляцию и наследование в своей кодовой базе TypeScript.