Модификатор protected в TypeScript

Приватные свойства и методы не наследуются потомками. Иногда, однако, нам нужно, чтобы свойство или метод не были доступны извне, но были унаследованы потомками. В этом случае следует использовать модификатор protected.

Давайте попробуем на практике. Объявим в нашем классе User метод cape как защищенный с помощью модификатора protected:

typescriptclass User {
  protected cape(str: string) {
    return str[0].toUpperCase() + str.slice(1);
  }
}

Сделаем класс Student, наследующий от класса User:

typescriptclass Student extends User {
  private name: string;
  
  constructor(name: string) {
    super();
    this.name = name;
  }
}

Добавим метод, выводящий имя:

typescriptclass Student extends User {
  private name: string;
  
  constructor(name: string) {
    super();
    this.name = name;
  }
  
  public showName(): string {
    return this.name;
  }
}

А теперь используем защищенный метод родителя внутри метода потомка:

typescriptclass Student extends User {
  private name: string;
  
  constructor(name: string) {
    super();
    this.name = name;
  }
  
  public showName(): string {
    return this.cape(this.name); // используем метод родителя
  }
}

Создадим объект нашего класса:

typescriptlet student: Student = new Student('john');

Воспользуемся методом для вывода студента:

typescriptconsole.log(student.showName());

А вот попытка вызвать метод cape снаружи класса приведет к ошибке:

typescriptconsole.log(student.cape('test')); // ошибка
Задание 1

Дан следующий класс:

typescriptclass User {
  protected name: string;
  protected surn: string;
  
  constructor(name: string, surn: string) {
    this.name = name;
    this.surn = surn;
  }
}

Унаследуйте от этого класса класс Employee, который добавит защищенное свойство salary, а также геттеры всех свойств, как своих, так и унаследованных.