Modificadores de Acesso em TypeScript
Os modificadores de acesso permitem ocultar o estado de um objeto do acesso externo e gerenciar o acesso a esse estado. No TypeScript, existem três modificadores: public, protected e private.
Se nenhum modificador for aplicado às propriedades e métodos das classes, essas propriedades e métodos são considerados como se fossem definidos com o modificador public. Ou seja, a seguinte definição de classe:
class Person {
  name: string;
  year: number;
}Será equivalente a:
class Person {
  public name: string;
  public year: number;
}private
Se o modificador private for aplicado às propriedades e métodos, não será possível acessá-los de fora ao criar um objeto dessa classe.
Por exemplo, vamos criar uma classe com propriedades e métodos privados:
class Person {
  private _name: string;
  private _year: number;
  constructor(name: string, age: number) {
    this._name = name;
    this._year = this.setYear(age);
  }
  public print(): void {
    console.log(`Nome: ${this._name}  Ano de nascimento: ${this._year}`);
  }
  private setYear(age: number): number {
    return new Date().getFullYear() - age;
  }
}
let tom = new Person("Tom", 24);
tom.print();
// console.log(tom._name); // não é possível acessar, pois _name é private
// tom.setYear(45);        // não é possível acessar, pois o método é privateAs duas propriedades _name e _year são declaradas com o modificador private, portanto, não podemos usá-las fora da classe, por exemplo, em console.log(tom._name). O mesmo se aplica ao método setYear(). Os demais métodos estão disponíveis.
protected
O modificador protected define campos e métodos que são visíveis apenas em classes derivadas, não podendo ser acessados de fora da classe:
class Person {
  protected name: string;
  private year: number;
  constructor(name: string, age: number) {
    this.name = name;
    this.year = this.setYear(age);
  }
  protected printPerson(): void {
    console.log(`Nome: ${this.name}  Ano de nascimento: ${this.year}`);
  }
  private setYear(age: number): number {
    return new Date().getFullYear() - age;
  }
}
class Employee extends Person {
  protected company: string;
  constructor(name: string, age: number, company: string) {
    super(name, age);
    this.company = company;
  }
  public printEmployee(): void {
    // console.log("Year: " + this.year); // não disponível, pois year é private
    // this.setYear(25);                  // não disponível, pois setYear é private
    this.printPerson(); // disponível, pois printPerson é protected
    console.log(`Empresa: ${this.company}`);
  }
}
let sam = new Employee("Sam", 31, "Microsoft");
sam.printEmployee();Na classe Employee, o campo name e o método printPerson() estão disponíveis, pois possuem o modificador protected. Porém, a propriedade privada year e o método privado setYear() não estão acessíveis.
Definindo campos através do construtor
O uso de modificadores nos parâmetros do construtor permite reduzir a quantidade de código escrita. Por exemplo, suponha que temos a seguinte classe:
class Person {
  private name: string;
  private age: number;
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
  printPerson(): void {
    console.log(`Nome: ${this.name}  Idade: ${this.age}`);
  }
}Essa classe é equivalente à seguinte:
class Person {
  constructor(private name: string, private age: number) {}
  printPerson(): void {
    console.log(`Nome: ${this.name}  Idade: ${this.age}`);
  }
}Ao usar modificadores nos parâmetros do construtor, não precisamos mais criar explicitamente propriedades para esses parâmetros. As propriedades são criadas automaticamente, recebem o nome dos parâmetros e possuem os mesmos modificadores.
Da mesma forma, se quisermos tornar as propriedades públicas, devemos usar o modificador public:
class Person {
  constructor(public name: string, public age: number) {}
  printPerson(): void {
    console.log(`Nome: ${this.name}  Idade: ${this.age}`);
  }
}Se for necessário tornar o campo somente leitura, adiciona-se o modificador readonly ao modificador de acesso:
class Person {
  constructor(private readonly name: string, private age: number) {}
}