Classes, Visibility, Protected (visibilidad protegida)

Las propiedades y métodos protected solo son visibles para subclases de la clase en donde son declaradas.

class Saludo {
    protected getDestinatario() {
        return "amigos";
    }
}

class SaludoEspecial extends Saludo {
    saludar() {
        console.log(`Hola ${this.getDestinatario()}`); // <- accedemos al método protected
    }
}

const saludo: SaludoEspecial = new SaludoEspecial();
saludo.saludar();
saludo.getDestinatario(); // <- error, no se tiene acceso de forma publica
Hola amigos

Habilitar los métodos protegidos

Las clases derivadas siguen el contrato definido por la clase padre, pero cuando pueden habilitar un subtipo de la clase base para brindar mas permisos sobre este. Esto incluye el convertir un método protected en public.

class Base {
    protected m = 10;
}

class Derivada extends Base {
    m = 15;
}

const d = new Derivada();
console.log(d.m);
15

Toma en cuenta que Derivada desde el momento que extiende Base tiene acceso a m, sin embargo al no incluir protected la propiedad m pasa a ser public y se vuelve accesible desde fuera de la definición de la clase.

Cross-hierarchy protected access (protected entre diferentes clases que comparten herencia)

Diferentes tipos de lenguajes de Lenguages de POO (Programación Orientados a Objetos) estan en desacuerdo en relación a si es valido o no acceder a elementos protected a través de diferentes clases que extienden la clase base.

Java por ejemplo considera que esto debe ser posible, mientras tanto otros lenguajes como C#, C++ y TypeScript consideran que esto no debe ser así.

class Base {
    protected x: number = 1;
}

class Derivada1 extends Base {
    protected x: number = 5;
}

class Derivada2 extends Base {
    imprimirX(c1: Derivada2) {
        // <-
        console.log(c1.x);
    }
}

Si reemplazamos Derivada2 por Derivada1 esto generará un error ya que esta fuera de su scope.

Property 'x' is protected and only accessible within class 'Derivada1' and its subclasses.