Alejandro Zeitler
Si bien tiene partes de un Node.js en ES6 simple, ¿es posible mezclar algunos módulos de TypeScript dentro del mismo proyecto?
Por ejemplo, tener algunos tipos definidos en TypeScript que se importan a través de require
en archivos ES6 simples?
Aluan Haddad
Sí, esto es posible.
Combine las siguientes opciones del compilador de TypeScript
-
--allowJs
Admite explícitamente fuentes mixtas de JavaScript y TypeScript
-
--outDir
Dado que todos los archivos se transpilarán, es necesario generar el JavaScript resultante en un directorio diferente; de lo contrario, la entrada
.js
los archivos se sobrescribirían1. -
--checkJs
Esto es completamente opcional. Si se especifica, el compilador verificará el tipo de archivos JavaScript, informando errores como en los archivos TypeScript, donde de lo contrario toleraría inconsistencias.
En cuanto al uso de tipos declarados en un archivo TypeScript en un archivo JavaScript, esto sí se puede hacer.
TypeScript en realidad potencia todo el sentido de JavaScript en herramientas como Visual Studio Code.
Los tipos se pueden colocar en JSDoc2 comentarios Estos comentarios pueden hacer referencia a tipos importados de TypeScript (.ts
/.tsx
/.d.ts
) archivos. Los IDE como Visual Studio Code proporcionarán resaltado de sintaxis y finalización automática dentro de estos comentarios.
Sin embargo, hay una advertencia. Debido a que no existe una sintaxis de manifiesto para los tipos en JavaScript, no se pueden importar individualmente, sino que se deben adjuntar a un valor que es importado. Esto se logra más convenientemente a través de la combinación de declaraciones de TypeScript como se muestra a continuación.
Ejemplo:
a.ts
export default createThing;
function createThing(...args): createThing.Thing {...}
namespace createThing {
export interface Thing {...}
}
b.js
import createThing from './a';
/**
* @param {createThing.Thing} thing
*/
export function takesThing(thing) {}
Notas:
1: --outDir
no es necesario si especifica adicionalmente el --noEmit
bandera. Haría esto cuando usara una herramienta como SistemaJS (con plugin-mecanografiado) o paquete web (con cargador ts) para alojar el transpilador de TypeScript. Lo mismo se aplica si está utilizando Nodo TS.
2: Aunque se llama JSDoc comentarios, se interpretan en el contexto del sistema de tipos TypeScript, no el sistema JSDoc. Lenguajes y herramientas como TypeScript y Google Compilador de cierre, secuestran efectivamente la sintaxis de JSDoc para sus propios fines y, por lo tanto, confieren significados potencialmente conflictivos a sus construcciones. Esto no suele ser un problema, pero vale la pena saberlo porque puede ser difícil determinar la aplicabilidad y corrección de estos comentarios y la compatibilidad de los tipos a los que hacen referencia o declaran.
Observaciones:
Aunque esta pregunta y respuesta se trata de importar tipos para usar en archivos JavaScript, a menudo es innecesario ya que el compilador inferirá los tipos a partir de los valores de sus expresiones.
También vale la pena mencionar que si necesita escribir muchas anotaciones de tipo de estilo JSDoc, es casi seguro que es mejor convertir el archivo a TypeScript, ya que la sintaxis para expresar tipos en JSDoc es torpe. Gracias a --allowJs
opción, puede hacer esto archivo por archivo, como se describe anteriormente.
-
Gracias, esto parece funcionar. ¿Puedo también mezclar?
require()
yimport
enb.js
?– Alexander Zeitler
04/04/2018 a las 20:08
-
@AlexanderZeitler mezclando
import
yrequire
es ortogonal, funcionará como dices. Si puedes o no usarrequire
depende del formato del módulo (--module
) tu específicas. Usted puede no utilizarrequire
si especificassystem
oes2015
porque esos formatos no lo proporcionan. si especificasamd
,commonjs
oumd
puedes usarlo. De todos modos, eso es una mala idea mezclarlos.– Aluan Haddad
04/04/2018 a las 20:41
-
Gracias por la explicación. La mezcla es solo para fines de migración en este momento.
– Alexander Zeitler
04/04/2018 a las 20:54
-
La mezcla no es necesaria para la migración porque las importaciones se transpilarán.
– Aluan Haddad
18 mayo 2019 a las 20:30
No, deben compilarse en JavaScript. TypeScript no es (necesariamente) JS sintácticamente válido antes de la compilación.
– jonrsharpe
3 abr 2018 a las 22:42