Un ingeniero del equipo de Inngest descubrió un bug sutil en los tipos genéricos de TypeScript de la librería inngest-js: al encadenar dos middleware, el tipo devuelto por step.run se colapsaba a {} y las propiedades de los objetos dejaban de ser accesibles, aunque en tiempo de ejecución el código funcionara correctamente. El artículo reconstruye la investigación paso a paso hasta localizar la causa raíz.
En Inngest, cada middleware aplica una transformación estática sobre la salida de los steps para adaptarla a JSON; el transform por defecto, Jsonify, elimina funciones, símbolos y undefined. Cuando se aplican dos middleware, los tipos se componen como Jsonify>, una operación idempotente en runtime pero problemática en el sistema de tipos.
El origen está en el filtro de claves serializables, que usa el idiom estándar de mapped types con [Key in keyof T]. Las propiedades opcionales conservan el modificador ?, de modo que al leer los valores el compilador incluye undefined en la unión de claves. Al estar K definido dentro de un genérico, la restricción de Pick se valida en el sitio de declaración y no se reevalúa al instanciarse, así que undefined se cuela como clave válida. En la segunda aplicación de Jsonify, keyof T contiene undefined, lo que provoca T[undefined] y desencadena el tipo error interno del compilador, que se propaga como un NaN hasta producir JsonifyObject<{}>.
El texto repasa además dos PR de la comunidad que rozaron la solución sin cerrar el problema y compara el patrón afectado con utilidades equivalentes de type-fest, sugiriendo envolver el filtro en Exclude<…, undefined> como arreglo directo.
