¿Existe una herramienta para convertir archivos JavaScript a TypeScript [cerrado]

133

Ahora salió TypeScript, es una noticia emocionante para mí, pero ¿cómo puedo convertir todos los archivos JavaScript existentes a TypeScript?

Gisway
fuente
3
Todos sus archivos javascript ya son archivos mecanografiados ya que el mecanografiado es un superconjunto de javascript.
Benjamin Gruenbaum
66
Esto es lo contrario de fuera de tema, la conversión de un lenguaje de programación a otro es TOTALMENTE una pregunta de programación.
Ivan Castellanos
2
@Tony_Henrich Bueno, entonces esto debería haberse trasladado allí en lugar de "cerrado como tema no oficial", y por cierto, dicho sitio debería tener una categoría clara para las recomendaciones de software destinadas a ingenieros de software.
Ivan Castellanos el
3
@ Tony_Henrich Digámoslo de esta manera: este es el mejor resultado en Internet para "convertir JavaScript a TypeScript" y lo mejor que puede hacer es cerrarlo de más respuestas y llamarlo fuera de tema. Creo que un pensamiento tan estrecho será la desaparición de este sitio.
Ivan Castellanos
55
ridículo que esto se cerró como fuera de tema.
bharal

Respuestas:

112

Me temo que esto será muy problemático. TypeScript es un superconjunto de JavaScript . Esto implica que todo el código JavaScript válido también es un código TypeScript válido. Lo cual está mal. El siguiente código es correcto en JavaScript, pero crea un error en TypeScript:

var data={x:5, y:6};
data.z=5;

Puede obtener el comportamiento dinámico de JavaScript declarando los datos como "ambiente"

var data:any={x:5, y:6};
data.z=5;

Ahora esto también funcionará en TypeScript. Sin embargo, puede cambiar la extensión de un archivo .js a .ts y pasar este archivo al compilador TypeScript. Esto realmente me confundió y formulé la pregunta en el canal IRC TypeScript en freenode. Resultó que el compilador de Script mecanografía comprueba su entrada para JavaScript válido y simplemente no hace nada en caso de que encuentre algo. Intuitivamente esto suena bien. Debería poder "convertir" todo su JavaScript a mecanografiado simplemente actualizando las extensiones de archivo y listo. Lamentablemente, esto no funciona como se esperaba. Supongamos que tienes este código:

var func=function(n){alert(n)};

var data={x:5};
data.z=6;

Editar: acabo de intentar compilar esto y no funciona. Lo siento, parece que me he equivocado: el compilador TypeScript ni siquiera acepta JavaScript puro. Trataré de averiguar qué salió mal.

Ha cambiado la extensión del archivo a .ts y utiliza la función func en su otro código. Al principio todo parece estar bien, pero luego aparece un error feo. Decide que alguna comprobación de tipo estático probablemente lo ayudará y cambia el código a:

var func=function(n:string){alert(n)};

var data={x:5};
data.z=6;

Pero ahora esto ya no es un código JavaScript válido y hará que el compilador genere muchos mensajes de error. Después de todos los datos no tiene miembro "z". ... Este comportamiento podría evitarse si el tipo predeterminado siempre fuera "cualquiera", pero la inferencia de tipos sería completamente inútil.

Entonces, ¿cómo se resuelve este problema? La respuesta es: archivos de declaración. Puede usar su código JavaScript "tal cual" en el proyecto y aún así obtener una comprobación de tipo estático con la ayuda de unos pocos archivos .d.ts. Informan al compilador qué variables, métodos y "clases" se declaran en un archivo JavaScript, incluidos sus tipos. Por lo tanto, permiten la verificación de tipos en tiempo de compilación y una inteligencia inteligente fantástica. Un archivo .d.ts para mi ejemplo sería

declare var data:any;
declare function func(n:string);

Guarde esto como "myjsfile.d.ts" e impórtelo a mecanografiado con

///<reference path="myjsfile.d.ts"/>

asegúrese de incluir el script JavaScript en su archivo html sobre el mecanografiado compilado. Aquí hay un enlace interesante . Puede interesarle la sección "Convertir JavaScript en TypeScript".

lhk
fuente
57
+1 para señalar que no todos los JS válidos son TS válidos.
Ken Smith
14
En realidad, todos los fragmentos de JavaScript que publicaste son guiones de texto válidos. Solo necesita desactivar algunos modificadores del compilador como --noImplictAny, etc. Sin embargo, es una buena idea activarlos eventualmente y agregar las anotaciones de tipo cuando sea necesario
Liero
Gracias. No obtengo nada más que argumentos cuando le digo a la gente que TypeScript no es un superconjunto de JavaScript, sin importar el ejemplo que proporcione. Finalmente, la gente abandona la discusión cuando les muestro por qué, y luego discuten lo mismo la próxima semana como para olvidar la prueba en el budín. " todo el código JavaScript válido también es código TypeScript válido ... simplemente está mal " - LHK
Cody
3
Con TypeScript permitiendo la compilación en JavaScript a pesar de los "errores" de TypeScript (en la versión demo actual de TypeScript, todos los ejemplos de JavaScript en esta respuesta no tienen problemas para compilar), funciona como un superconjunto, al menos de esas características de JavaScript que el compilador TypeScript es capaz de manejar ...
Brett Zamir
Sí, he estado "en ambos lados" de este problema. Básicamente, TS es un superconjunto de JS en el sentido de que: TypeScript se quejará de algún código JS válido, pero mientras noEmitOnErroresté desactivado, todavía puede operar y emitir su transpilación. Por lo tanto, si bien muestra errores (lo cual es perturbador), en realidad puede ignorar esos errores y utilizar la transpilación TypeScript a pesar de ello (permitiendo, por ejemplo, la transición gradual de JS a TS). Además, al menos algunos de los errores se pueden deshabilitar a través de interruptores como noImplicitAny(quizás todos, aunque IDK).
Venryx
51

Actualización: la herramienta se describe en detalle en esta publicación

ReSharper a partir de la versión 9 ( compilaciones EAP disponibles ) tiene la funcionalidad de convertir automáticamente el código JavaScript en TypeScript. Puede comenzar cambiando el nombre del archivo .js a .ts y ver sugerencias de R # como esta:

No lo he probado en ejemplos del mundo real. Pero es capaz de convertir una gran cantidad de patrones de JavaScript.

Shkredov S.
fuente
Me encantaría hacer esto sobre la marcha utilizando meta archivos editados a mano, creando toda la hinchazón de TS que necesita.
xamiro
Hola, estoy usando resharper, ¿así que solo renombro bien de .js a .ts solamente? Al igual que estoy usando un archivo .js y cambiar el nombre del archivo con a.ts es resharper dará alguna sugerencia? Estoy usando la versión comunitaria de Visual Studio e instalé Resharper
Swift el
1

Desde la terminal (mac):

for f in *.js; do mv $f `basename $f .js`.ts; done;

Renombra todos los archivos .js a .ts

Esto es algo irónico, pero como Benjamin señala arriba, los archivos JavaScript son TypeScript válidos . Si desea agregar tipos, clases, interfaces, etc. a su JavaScript, necesitará diseñar y cambiar su código utilizando estos conceptos , hay poca o ninguna conversión automática para esto.

Con GNU findutils (la mayoría * nixes) + Bash, solo haz:

find -type f -name '*.js' -exec bash -c 'mv "${1}" "${1%???}.ts"' bash {} \;
7zark7
fuente
10
+1: es un poco como intentar convertir un libro abreviado de nuevo a la versión completa automáticamente.
Fenton
Se elimina toda la información de tipo y se eliminan todas las interfaces; se ha eliminado bastante información. Cualquier JavaScript que tenga suficiente información para inferir la información del tipo ya se puede pegar en un archivo TypeScript y el compilador resolverá los tipos, pero hay muchas instancias que no funcionarán porque el JavaScript no es consistente.
Fenton
1
¿Convertir de qué a qué? ¿Derivando tipos de JS y agregándolos a vars? No estoy seguro de qué más se podría convertir automáticamente, no estoy seguro de cómo se podrían derivar las clases, las interfaces y los módulos (de manera sensata).
7zark7
44
No todo el código JavaScript es válido en TypeScript, intente esto:var a = 5; a = "";
coudy
44
Para respaldar eso y justificar el voto negativo, se dará cuenta rápidamente de que no todo el código JS es válido en TypeScript cuando intenta convertir módulos o complementos a TypeScript desde su JS nativo (por ejemplo: jquery.address, etc.)
dpb