Cheatsheet de Angular Signals
signal, computed, effect, linkedSignal, resource. Una página. Sin rodeos. Pégala al monitor.

Cargando…
Descarga gratis el cheatsheet de Signals v22. Una página para tener los primitivos claros, sin spam.
Sin spam. Te puedes dar de baja cuando quieras.
Signals cambió el modelo mental de Angular. Este cheatsheet reúne los seis conceptos que necesitas dominar para escribir código reactivo limpio en v22.
signal() y computed()
Estado reactivo declarativo. computed() memoiza automáticamente — no recalcula si las dependencias no cambiaron.
effect() sin abusar
Cuándo tiene sentido y cuándo estás resolviendo el problema equivocado. Los anti-patrones más comunes.
linkedSignal() y resource()
Los dos nuevos de v22. linkedSignal para estado derivado editable; resource/httpResource para datos asíncronos sin subscribe.
Integración con el template
Cómo Angular detecta los cambios con Signals, por qué ya no necesitas AsyncPipe y cómo @if y @for se llevan con el nuevo modelo.
Guía rápida
No es otro PDF genérico sobre Angular. Es una referencia rápida para tener al lado mientras escribes componentes con Signals: qué hace cada API, cuándo usarla y qué errores evitar.
Una Signal es un wrapper reactivo alrededor de un valor. Cuando ese valor cambia, Angular sabe exactamente qué nodos del DOM necesitan actualizarse — sin Zone.js, sin ChangeDetectorRef, sin magia. El modelo es completamente síncrono y explícito: lees con (), escribes con .set() o .update(), y Angular hace el resto.
const price = signal(100);
price(); // read → 100
price.set(120); // write → notify consumers
price.update(p => p * 1.1); // transformEl cambio importante no es la función signal(). Es el grafo que Angular construye cuando tu código lee signals. Cada signal es un productor. Cada template, computed(), effect(), linkedSignal() o resource() que lee esa signal se convierte en consumidor. Cuando el productor cambia, Angular sabe qué consumidores debe invalidar, marcar o recalcular.
const price = signal(100);
const quantity = signal(2);
const subtotal = computed(() => price() * quantity());
const tax = computed(() => subtotal() * 0.21);
const total = computed(() => subtotal() + tax());¿Ya te hizo click el modelo mental? Ten el mapa de Signals a mano mientras programas.
Descargar el cheatsheet gratisAngular no te pide un array de dependencias como en otros frameworks. Las descubre ejecutando el código. Si un computed lee price() y quantity(), esas dos signals entran en el grafo. Si en la siguiente ejecución lee discountPrice() pero ya no lee quantity(), Angular actualiza el grafo y deja de escuchar lo que ya no importa.
const useDiscount = signal(false);
const basePrice = signal(100);
const discountPrice = signal(70);
const finalPrice = computed(() => {
if (useDiscount()) {
return discountPrice(); // depends on useDiscount + discountPrice
}
return basePrice(); // depends on useDiscount + basePrice
});Cuando haces .set(), Angular no recalcula todo inmediatamente. Primero empuja la suciedad por el grafo: marca como inválidos los consumidores afectados. Después, cuando alguien lee una signal derivada, tira del valor actualizado y recalcula solo lo necesario. Push para invalidar. Pull para calcular.
basePrice.set(120);
// Push: Angular marks finalPrice as stale.
// Pull: finalPrice() recalculates when someone reads it.
console.log(finalPrice());El grafo no es una metáfora bonita. De él salen tres propiedades prácticas que notas escribiendo componentes reales: memoización, ejecución glitch-free y dependencias dinámicas.
Zone.js responde a una pregunta muy amplia: algo ha pasado en el navegador, ¿debería Angular revisar la UI? Signals responde a una pregunta mucho más útil: este valor concreto cambió, ¿qué partes exactas de la UI dependen de él? Esa diferencia es la razón por la que Angular puede funcionar sin Zone.js.
Signals no mata RxJS. Le quita trabajo donde RxJS era demasiado para el problema. La decisión sana no es migrarlo todo, sino elegir la herramienta por el tipo de estado que tienes delante.
effect() existe para sincronizar Signals con el mundo exterior: analytics, localStorage, APIs del navegador, logs o librerías que no son reactivas. El error aparece cuando lo usas para derivar estado escribiendo otra signal dentro del effect. En v22 Angular te deja hacerlo, pero el riesgo real es crear un ciclo infinito si el effect lee algo que termina volviendo a escribir.
const price = signal(100);
const quantity = signal(2);
const totalState = signal(0);
// Bad: derived state written inside an effect.
effect(() => {
totalState.set(price() * quantity());
});
// Better: derived state belongs in computed().
const total = computed(() => price() * quantity());La sintaxis de Signals es pequeña, pero el modelo mental cambia bastante. Estos son los fallos que más rápido ensucian una migración.
También en la serie
Cada recurso se descarga por separado, así recibes justo el material que necesitas.
Únete gratis
Introduce tu email y recibe este material de la Serie Angular v22 en tu bandeja de entrada.
Sin spam. Te puedes dar de baja cuando quieras.