Get e Set em TypeScript: a mágica dos accessors sem complicação
\n\nVocê já escreveu uma classe em TypeScript e pensou: "Queria que uma propriedade fosse inteligente, que ao ser lida ela calculasse algo e ao ser alterada ela validasse os dados"? Conheça os getters (get) e setters (set). Eles não são apenas açúcar sintático, mas uma ferramenta poderosa para controlar o acesso aos dados.
\n\nSe você já pesquisou sobre o assunto no Stack Overflow, sabe que a pergunta "get and set in TypeScript" acumula milhares de visualizações. As pessoas se confundem sobre quando usar accessors e quando usar métodos comuns. Neste artigo, vamos organizar tudo: do básico aos detalhes mais sutis.
\n\nPronto? Vamos lá!
\n\nO que são get e set em TypeScript?
\n\nUm getter é um método chamado ao ler uma propriedade. Um setter é um método chamado ao atribuir um valor. Juntos, eles formam os accessors. A sintaxe parece que você está trabalhando com um campo comum, mas por baixo dos panos há lógica.
\n\nVeja um exemplo mínimo:
\n\nclass User {\n private _name: string = '';\n\n get name(): string {\n return this._name;\n }\n\n set name(value: string) {\n if (value.length > 0) {\n this._name = value;\n } else {\n console.log('O nome não pode ser vazio');\n }\n }\n}\n\nconst user = new User();\nuser.name = 'Ana'; // chama o set\nconsole.log(user.name); // chama o get → 'Ana'\nuser.name = ''; // tenta definir nome vazio → mensagem no console\n\nObserve: a propriedade _name com o prefixo _ é um campo privado. O acesso direto a ela de fora é impossível. Em vez disso, usamos o accessor público name.
Por que usar getters e setters? 3 razões principais
\n\n1. Validação de dados
\nO setter é o local ideal para verificar valores de entrada. Você pode rejeitar dados inválidos antes que eles entrem no objeto.
\n\nclass Temperature {\n private _celsius: number = 0;\n\n get celsius(): number {\n return this._celsius;\n }\n\n set celsius(value: number) {\n if (value < -273.15) {\n throw new Error('Temperatura abaixo do zero absoluto é impossível');\n }\n this._celsius = value;\n }\n}\n\n2. Propriedades calculadas
\nUm getter pode retornar não um valor armazenado, mas o resultado de cálculos baseados em outros dados.
\n\nclass Rectangle {\n constructor(public width: number, public height: number) {}\n\n get area(): number {\n return this.width * this.height;\n }\n\n get perimeter(): number {\n return 2 * (this.width + this.height);\n }\n}\n\nconst rect = new Rectangle(10, 5);\nconsole.log(rect.area); // 50 — calculado na hora\n\n3. Encapsulamento e controle de acesso
\nVocê pode tornar uma propriedade somente leitura (apenas getter) ou somente escrita (apenas setter). Isso ajuda a seguir os princípios de POO.
\n\nclass Config {\n private _apiKey: string = 'secret123';\n\n get apiKey(): string {\n // Pode adicionar logging ou verificação de permissões\n return this._apiKey;\n }\n // Setter não definido — propriedade somente leitura\n}\n\nconst config = new Config();\nconsole.log(config.apiKey); // 'secret123'\n// config.apiKey = 'newKey'; // Erro de compilação!\n\nPerguntas frequentes sobre get e set em TypeScript
\n\nVamos abordar o que é mais perguntado por iniciantes (e não só) no Stack Overflow e fóruns.
\n\nPergunta 1: Qual a diferença entre get/set e métodos comuns?
\nA principal diferença é a sintaxe de chamada. Accessors parecem propriedades: sem parênteses. Isso torna o código mais limpo e intuitivo. Compare:
\n\n// Com métodos\nuser.getName();\nuser.setName('Pedro');\n\n// Com accessors\nuser.name;\nuser.name = 'Pedro';\n\nA segunda diferença é que accessors não podem ser sobrecarregados (overload). Cada accessor tem uma única assinatura.