Introducción: "¿Su archivo .ts no se abre? No está solo"
\n\nImagine: está escribiendo código genial en TypeScript, guarda el archivo con la extensión .ts, ejecuta el comando node myfile.ts... y recibe algo como: "Unknown file extension ".ts". ¿Le suena familiar? Si ha mirado en Stack Overflow, sabrá que esta pregunta ha acumulado miles de visitas y cientos de comentarios. El problema es antiguo, pero sigue siendo relevante.
En este artículo no solo copiaremos una respuesta de un foro. Analizaremos por qué ocurre esto, cómo solucionarlo y qué hacer para no volver a encontrarse con este error. Aprenderá a configurar correctamente un proyecto TypeScript, usar ts-node y la configuración tsconfig.json. ¡Allá vamos!
¿Por qué ocurre el error "Unknown file extension ".ts"?
\n\nVayamos al grano. Node.js no entiende los archivos .ts por defecto. Solo reconoce .js, .json, .mjs y .cjs. Cuando escribe node myfile.ts, Node.js intenta ejecutar el código TypeScript como si fuera JavaScript normal, pero se encuentra con una sintaxis que no conoce (por ejemplo, tipos, interfaces, genéricos).
El resultado es un error. Pero también hay otra situación: usa ts-node o tsx, pero aún así ve el mismo mensaje. ¿Por qué? Porque en las versiones modernas de Node.js (a partir de la 16) se agregó una verificación estricta de extensiones en package.json, especialmente cuando está configurado "type": "module".
Causas principales:
\n- \n
- Ejecución directa de
node file.ts— Node.js no sabe compilar TypeScript sobre la marcha. \n - Falta de
ts-nodeotsx— no hay una herramienta para la transpilación. \n - Configuración incorrecta de
tsconfig.json— por ejemplo, no se especificó el módulo o el target. \n - Problemas con
package.json— si tiene"type": "module",ts-nodepuede requerir la extensión explícita. \n
Solución 1: Usar ts-node (método clásico)
\n\nLa forma más sencilla de ejecutar TypeScript sin compilación previa es usar ts-node. Este paquete compila los archivos .ts en memoria y pasa el resultado a Node.js.
Instalación y ejecución
\nnpm install -g ts-node\nts-node myfile.ts\n\nSi usa un proyecto local, es mejor instalarlo como dependencia de desarrollo:
\nnpm install --save-dev ts-node\nnpx ts-node myfile.ts\n\nEjemplo de un archivo simple hello.ts:
const greet = (name: string): string => {\n return `¡Hola, ${name}!`;\n};\n\nconsole.log(greet("Mundo"));\n\nEjecutamos: npx ts-node hello.ts — y vemos en la consola "¡Hola, Mundo!". ¡Funciona!
Pero hay un detalle: "type": "module"
\nSi en su package.json está especificado "type": "module", ts-node puede negarse a funcionar. En ese caso, debe eliminar temporalmente esa línea o usar el flag --esm:
npx ts-node --esm myfile.ts\n\nSolución 2: Usar tsx (herramienta moderna)
\n\ntsx es una alternativa más rápida a ts-node, basada en esbuild. Funciona con ESM de fábrica y no requiere flags adicionales.
Instalación:
\nnpm install --save-dev tsx\n\nEjecución:
\nnpx tsx myfile.ts\n\nEjemplo usando características modernas de TypeScript:
\n// types.ts\nexport interface User {\n id: number;\n name: string;\n email: string;\n}\n\nconst user