Prompt y contexto
Un servicio de Node.js actualmente compila TypeScript a JavaScript antes de que el contenedor se inicie. El equipo desea ejecutar archivos .ts directamente para acortar los scripts y la cadena de herramientas de desarrollo. Explique el type stripping nativo, su límite de soporte, la resolución de módulos, los límites de configuración, las pruebas y la estrategia de lanzamiento a producción.
Lo que evalúa el entrevistador
- Si sabe que Node.js elimina las anotaciones de tipos sin realizar verificación de tipos (type checking) ni generación de código en tiempo de ejecución.
- Si identifica enums, namespaces en tiempo de ejecución, parameter properties y decorators como sintaxis no borrable (non-erasable).
- Si comprende que Node.js ignora
tsconfig.json, por lo que los alias de rutas y las transformaciones de target no se aplican automáticamente. - Si separa los scripts de desarrollo, los artefactos compilados, las dependencias y los servicios de producción.
Preguntas de clarificación para hacer
- ¿El objetivo es un script de desarrollo, una CLI, pruebas o un servicio de producción de larga ejecución?
- ¿El código utiliza enums, decorators, parameter properties, namespaces o alias de rutas?
- ¿Se pueden estandarizar el modo de módulos, la versión de Node, la versión de TypeScript y la imagen de lanzamiento?
- ¿El equipo necesita verificación de tipos completa, transformación de código fuente, source maps o soporte para versiones anteriores de Node?
Estructura de respuesta en 30 segundos
Trataría la funcionalidad nativa como un ejecutor ligero. Reemplaza la sintaxis de tipos borrable con espacios en blanco, no realiza verificación de tipos y no genera JavaScript para enums o decorators. Primero inspeccione el código y fije la versión de Node. Utilice import type, extensiones explícitas y reglas de módulos claras en lugar de depender de los alias de rutas de tsconfig. Los servicios que necesitan la semántica completa de TypeScript conservan el compilador o tsx; la ruta nativa comienza con scripts y herramientas pequeñas. CI ejecuta verificaciones de tipos, pruebas en tiempo de ejecución y comprobaciones de artefactos antes de expandir el alcance.
Análisis detallado paso a paso
1. Explicar el modelo de borrado (erasure model)
Node.js reemplaza las anotaciones de tipos con espacios en blanco, por lo que los números de línea del stack generalmente permanecen alineados sin necesidad de source maps. No realiza verificación de tipos ni transforma sintaxis que requiera generación de JavaScript. Los enums, namespaces en tiempo de ejecución, parameter properties y decorators producen errores de sintaxis no soportada. La ejecución directa está limitada a la sintaxis borrable.
2. Fijar módulos e importaciones
Node.js admite archivos TypeScript CommonJS y ES module; el modo real depende de la configuración del paquete, la extensión y la invocación. Las importaciones de tipos deben usar import type; de lo contrario, la importación borrada se trata como un valor y falla en tiempo de ejecución. Utilice extensiones relativas resolubles y package.json imports en lugar de alias que Node no pueda transformar.
3. Respetar tsconfig y los límites de dependencias
El ejecutor nativo ignora tsconfig.json, por lo que no aplica target lowering, mapeo de paths u otras transformaciones del compilador. Node.js también rechaza archivos TypeScript bajo node_modules para evitar que el código fuente no compilado se convierta en un contrato de paquete. Utilice un compilador completo o una herramienta en tiempo de ejecución cuando se requieran transformaciones, decorators o dependencias de TypeScript.
4. Planificar la validación y el rollback
Ejecute lint, verificaciones de tipos, pruebas unitarias, pruebas de integración y startup probes a través de la matriz de versiones de Node. Compare la ejecución compilada y la borrada en cuanto a comportamiento, tiempo de inicio y errores. Fije el entorno de ejecución: el type stripping es estable a partir de v25.2 y v24.12, mientras que v26 elimina el flag de transformación experimental. Si la producción falla, regrese a los artefactos compilados en lugar de habilitar transformaciones no soportadas de forma ad hoc.
Respuesta de muestra de alta calidad
Trataría el type stripping nativo como una ruta de ejecución ligera de TypeScript, no como un compilador completo. Haga un inventario de enums, decorators, parameter properties, namespaces en tiempo de ejecución, alias de rutas y dependencias de TypeScript; estos necesitan transformación o verificación, por lo que debe mantener el compilador o tsx. El código migrado utiliza import type, reglas de módulos estables y rutas relativas resolubles, mientras que tsc --noEmit permanece como el control de verificación de tipos. Node.js ignora tsconfig, por lo que los scripts de compilación deben configurar las importaciones de paquetes explícitamente. Realice un despliegue tipo canary primero en scripts de desarrollo y CLIs, y haga que CI compare startup probes, errores en tiempo de ejecución, pruebas y comportamiento de la imagen. La funcionalidad es estable a partir de v25.2/v24.12 y v26 elimina el flag de transformación experimental. Los servicios de producción cambian solo después de que la matriz pase y conservan un rollback a artefactos compilados.
Errores comunes
- Tratar el type stripping como verificación de tipos o como un compilador completo.
- Ejecutar directamente archivos con enums, decorators, parameter properties o namespaces en tiempo de ejecución.
- Depender de paths de tsconfig, transformaciones de target o configuraciones de JSX.
- Omitir
import typey provocar un error de importación de valor en tiempo de ejecución tras el borrado. - Ejecutar TypeScript no compilado desde
node_modulesen una imagen de producción. - Medir la velocidad de inicio sin verificaciones de tipos, pruebas de integración o una matriz de versiones anteriores.
Preguntas y respuestas de seguimiento
¿Por qué el type stripping generalmente no necesita un source map?
La implementación reemplaza las anotaciones con espacios en blanco y preserva las posiciones de los caracteres, por lo que las líneas en tiempo de ejecución generalmente siguen coincidiendo con el archivo fuente. La sintaxis transformada todavía necesita un compilador completo y source maps.
¿Cuándo deben permanecer tsx o un compilador?
Mantenga la cadena de herramientas para enums, decorators, parameter properties, alias de rutas, transformaciones de target, verificación de tipos completa o dependencias de TypeScript que requieran compilación.
¿Cómo controla las diferencias de versión de Node?
Fije las versiones en imágenes, CI y herramientas locales, y realice detección de capacidades. Trate el type stripping como un prerrequisito del entorno de ejecución y recurra a un artefacto de JavaScript verificado cuando esté ausente.