Pular para o conteúdo
logo
← ArtigosFrontend

Angular Signals

Uma forma moderna de gerenciar estado reativo no Angular.

6 min de leitura
AngularSignalsEstado reativoRxJSTypeScript

Introdução

O Angular passou por uma grande evolução com a introdução dos Signals na versão 16 (estável a partir da v17). Essa nova primitiva de reatividade muda fundamentalmente como gerenciamos e propagamos estado na aplicação.

Se você quer entender as tendências modernas do framework, dominar Signals é essencial.


O que é um Signal?

Em termos práticos, um Signal:

  • Armazena um valor (qualquer tipo)
  • Notifica automaticamente quem depende dele quando muda
  • Rastreia dependências de forma transparente (sem necessidade de subscribe)
import { signal, computed, effect } from "@angular/core";
 
// Criando um signal
const count = signal(0);
 
// Lendo o valor
console.log(count()); // 0
 
// Atualizando o valor
count.set(1);
count.update((v) => v + 1);

Tipos de Signals

signal() — Signal mutável

O Signal básico. Você cria, lê e modifica seu valor diretamente.

const name = signal("André");
name.set("André Leite"); // substitui
name.update((prev) => prev.toUpperCase()); // transforma

computed() — Signal derivado

Deriva um valor a partir de outros Signals. Read-only e recalculado apenas quando as dependências mudam.

const firstName = signal("André");
const lastName = signal("Carvalho");
 
const fullName = computed(() => `${firstName()} ${lastName()}`);
// fullName() → "André Carvalho"

effect() — Efeito colateral reativo

Executa um efeito quando qualquer Signal que ele lê muda. Útil para logging, sincronização com APIs, etc.

effect(() => {
  console.log("Nome mudou para:", name());
});

Signals vs RxJS

Entenda as diferenças:

AspectoSignalsRxJS
ModeloPush síncronoPush assíncrono
APISimples (signal, computed, effect)Rico (Observable, operadores)
Curva de aprendizadoBaixaAlta
Operações assíncronasLimitadoPoderoso
Integração AngularNativa (v16+)Histórica
Tree-shakingExcelenteDepende do uso
import { toSignal } from "@angular/core/rxjs-interop";
import { HttpClient } from "@angular/common/http";
 
// Convertendo Observable → Signal
const users = toSignal(this.http.get<User[]>("/api/users"), { initialValue: [] });

Uso em Componentes

Substituindo @Input() com Signal Inputs (v17.1+)

import { Component, input, output } from "@angular/core";
 
@Component({ selector: "app-counter", template: `...` })
export class CounterComponent {
  // Signal Input — read-only Signal derivado do pai
  count = input<number>(0);
 
  // Signal Output — equivalente ao EventEmitter
  increment = output<void>();
}

Substituindo ngModel com Signal Forms

@Component({
  template: `
    <input [ngModel]="name()" (ngModelChange)="name.set($event)" />
    <p>Olá, {{ name() }}!</p>
  `,
})
export class FormComponent {
  name = signal("");
}

Vantagens dos Signals

  1. Reatividade granular — Apenas os componentes que dependem do Signal são re-renderizados
  2. Sem subscriptions — Não há risco de memory leak por esquecer de unsubscribe
  3. Debugging simples — O valor é síncrono e sempre acessível
  4. Bundle menor — Menor overhead que observables para casos simples
  5. Integração com o compilador — O Angular pode otimizar a detecção de mudanças

Casos de Uso


Perguntas de Entrevista

Pergunta de Entrevista

O que é um Signal no Angular e qual problema ele resolve?

Fácil
Pergunta de Entrevista

Qual a diferença entre signal(), computed() e effect()?

Fácil
Pergunta de Entrevista

Como Signals se integram com RxJS no Angular?

Médio
Pergunta de Entrevista

O que é Zone.js e como Signals mudam sua relação com o Angular?

Difícil