Uniones
NonNullable
Elimina `null` y `undefined` de un tipo.
Qué es
Merece la pena leer la definición. Antes era un condicional distributivo; desde TypeScript 4.8 es `T & {}`, porque intersecar con el tipo objeto vacío elimina exactamente los dos tipos que no pueden tener propiedades. Más corto, más rápido y ya no distributivo — lo cual solo importa en los rincones.
Ejemplos
NonNullable<string | null>
→stringNonNullable<string | undefined | null>
→stringNonNullable<null>→never
Cada tipo resuelto de arriba lo imprimió TypeScript 5.9.3, no se escribió a mano.
Lo que no hace
- No toca una propiedad anidada. `NonNullable<{ a: string | null }>` no cambia — la nulabilidad está dentro, y esto actúa fuera.
- No acota un valor en tiempo de ejecución. Una variable de tipo `string | null` sigue necesitando una comprobación; esto solo describe el tipo tras ella.
Conclusión
La definición cambió bajo los pies de todos en la 4.8 y casi nadie se dio cuenta, que es el argumento para citar definiciones en vez de recordarlas.