Patrones
Una página por pregunta. Cada receta compila, cada resultado es el tipo que imprimió el compilador, y cada página dice dónde falla la receta.
Cada receta y cada resultado se compilan al construir el sitio
- ¿Cómo evito que un `UserId` se pase donde se esperaba un `OrderId`, si ambos son solo cadenas?TypeScript es estructural, así que dos alias de `string` son el mismo tipo. Una propiedad fantasma los hace distintos sin cambiar el valor.Marcar un primitivo
- ¿Cómo obtengo un error de compilación cuando alguien añade un caso a una unión y olvida gestionarlo?Acota cada caso y asigna lo que quede a `never`. Cuando la unión crece, lo que queda deja de ser nada y la asignación falla.Hacer exhaustivo un switch
- ¿Cómo evito que `Omit<User, "nmae">` tenga éxito en silencio y no quite nada?El integrado restringe su parámetro de clave a `keyof any`, que es toda clave que pudiera existir. Restríngelo a `keyof T` en su lugar.Hacer que Omit detecte erratas
- ¿Cómo convierto `{ a: string } & { b: number }` en `{ a: string; b: number }` para que los tooltips se lean y las comprobaciones de igualdad pasen?Un mapeo homomórfico recorre cada clave una vez y reconstruye un único objeto. Los modificadores sobreviven; la intersección no.Aplanar una intersección
- ¿Por qué `Object.keys(config)` me da `string[]` en vez de las claves que veo ahí mismo?Porque un valor puede tener más claves que las que su tipo declara, y `Object.keys` las devuelve todas. Acotar el retorno es una decisión deliberada y local — no el arreglo de un fallo.Obtener claves tipadas de un objeto
- ¿Cómo acepto un objeto de opciones donde todos los campos son opcionales pero el objeto vacío no vale?Construye una variante por clave donde esa clave es obligatoria y el resto opcionales, y únelas. Cualquier clave suministrada satisface al menos una variante.Exigir al menos una propiedad
- ¿Cómo leo `user.address.city` mediante una ruta reutilizable sin perder el tipo del resultado?Genera recursivamente las tuplas de claves válidas y consume una clave cada vez para calcular el valor final.Obtener un valor por una ruta profunda tipada
- ¿Cómo mantengo cada nombre de evento emparejado con su carga y listener correctos?Usa un mapa de eventos y un parámetro de clave para que el nombre seleccione la carga en ambos métodos.Tipar un emisor de eventos
- ¿Cómo hago que los datos de éxito solo estén disponibles en la rama de éxito y los errores en la de fallo?Da a cada variante un campo literal compartido. Comprobarlo estrecha el objeto entero, no solo el campo.Modelar estados que se estrechan
- ¿Cómo permito que quien llama elija entrada y transformación sin escribir argumentos de tipo?Coloca los parámetros de tipo donde los valores los revelan: uno en el elemento del array y otro en el retorno del callback.Inferir un resultado genérico desde un callback
- ¿Cómo acepto `href` u `onClick` pero rechazo objetos que proporcionan ambos?Une las dos formas y añade las claves únicas del otro lado como propiedades opcionales `never`.Hacer dos formas de props mutuamente excluyentes
- ¿Cómo acepto una clave de búsqueda rechazando tanto una consulta vacía como una con varias claves?Construye una variante por clave: exige esa clave y prohíbe las demás con `never` opcional.Exigir exactamente una propiedad
- ¿Cómo obtengo solo las claves cuyas propiedades son cadenas, funciones u otro tipo elegido?Mapea cada clave a sí misma o a `never` e indexa el objeto para recoger las supervivientes.Seleccionar claves por su tipo de valor
- ¿Cómo evito mutaciones bajo el primer nivel en vez de congelar solo el tipo del objeto exterior?Conserva funciones, recorre arrays y mapea cada propiedad del objeto con el modificador readonly.Hacer un objeto profundamente de solo lectura
- ¿Cómo evito que una unión literal y el array u objeto usado en ejecución se desincronicen?Mantén un valor como fuente de verdad, conserva sus literales con `as const` y consulta su tipo.Derivar una unión desde datos de ejecución
- ¿Cómo conservo la relación entre cada clave y su valor al iterar `Object.entries`?Construye una unión de tuplas clave/valor con un tipo mapeado y encierra la aserción inevitable en un ayudante.Obtener entradas tipadas de un objeto
- ¿Cómo hago que un ayudante infiera una tupla literal sin exigir `as const`?Marca el parámetro como `const`; la inferencia preferirá formas literales readonly frente a arrays y primitivos ampliados.Conservar literales con un genérico const
- ¿Cómo acepto callbacks que devuelven `T` o `Promise<T>` y expongo siempre un resultado predecible?Acepta un valor o promesa, espéralo y describe el resultado aplanado con `Awaited`.Normalizar un callback síncrono o asíncrono
- ¿Cómo selecciono una propiedad de cada objeto y conservo su tipo en el array devuelto?Vincula la clave a `keyof T` y usa acceso indexado para el elemento de retorno.Extraer una propiedad tipada de objetos
- ¿Cómo indexo una unión discriminada por su `kind` en vez de extraer miembros repetidamente?Mapea la unión y remapea cada miembro al valor literal de su discriminante.Convertir una unión en mapa de consulta

