Boa, Carlos! E olha, o fato de você ter parado pra questionar mesmo tendo acertado mostra que você tá no caminho certo — entender o porquê é muito mais valioso do que só acertar.
Vamos lá: o underline antes do nome (tipo _nome) é só uma convenção, um costume que programadores adotaram pra indicar visualmente "ei, essa propriedade é privada, não mexa nela de fora." Mas isso é só um acordo entre humanos — pro JavaScript e pro TypeScript, _nome é uma variável como qualquer outra. O underline não faz nada de especial tecnicamente.
Já o private é diferente. Ele é um modificador de acesso do TypeScript, uma palavra-chave que efetivamente diz pro compilador: "essa propriedade só pode ser acessada de dentro da classe." Se alguém tentar acessar de fora, o TypeScript vai reclamar e apontar um erro de compilação.
Então na alternativa correta:
class Pessoa {
private nome; // TypeScript vai proteger isso de verdade
idade;
constructor(nome, idade) {
this.nome = nome;
this.idade = idade;
}
}
let pessoa = new Pessoa('Barney', 18);
pessoa.nome = 'Martin'; // ERRO! TypeScript não deixa acessar
O erro acontece porque nome foi declarado com private, e lá embaixo o código tenta acessar pessoa.nome de fora da classe. O TypeScript barra isso.
Então é isso: _nome é só um lembrete visual pra gente, tipo uma plaquinha de "não entre." Já o private é a tranca de verdade — é ele que o TypeScript usa pra barrar o acesso. E dá pra usar os dois juntos, tipo private _nome, mas quem faz o trabalho pesado é o private, não o underline. Tranquilo?