Existe-t-il un outil pour convertir des fichiers JavaScript en TypeScript [fermé]


134

Maintenant, TypeScript est sorti, c'est une nouvelle passionnante pour moi, mais comment puis-je convertir tous les fichiers JavaScript existants en TypeScript.


3
Tous vos fichiers javascript sont déjà des fichiers dactylographiés puisque typescript est un sur-ensemble de javascript.
Benjamin Gruenbaum

6
C'est le contraire du hors-sujet, la conversion d'un langage de programmation à un autre est TOTALEMENT une question de programmation.
Ivan Castellanos

2
@Tony_Henrich Eh bien, cela aurait dû être déplacé là-bas au lieu de "fermé comme hors-sujet", et d'ailleurs ce site devrait avoir une catégorie claire pour les recommandations logicielles destinées aux ingénieurs en logiciel.
Ivan Castellanos

3
@Tony_Henrich Disons les choses de cette façon: C'est le meilleur résultat sur Internet pour "convertir JavaScript en TypeScript" et la meilleure chose que vous pouvez faire est de le fermer des autres réponses et de l'appeler hors sujet? Je pense que cette réflexion étroite sera la disparition de ce site.
Ivan Castellanos

5
ridicule que cela ait été fermé comme hors sujet.
bharal

Réponses:


112

Je crains que ce ne soit très problématique. TypeScript est un sur-ensemble de JavaScript . Cela implique que tout code JavaScript valide est également du code TypeScript valide. Ce qui est tout simplement faux. Le code suivant est correct en JavaScript, mais crée une erreur dans TypeScript:

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

Vous pouvez obtenir le comportement dynamique de JavaScript en déclarant les données comme «ambiantes»

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

Maintenant, cela fonctionnera également dans TypeScript. Néanmoins, vous pouvez changer l'extension d'un fichier .js en .ts et transmettre ce fichier au compilateur TypeScript. Cela m'a vraiment dérouté et j'ai posé la question dans le canal IRC TypeScript sur freenode. Il s'est avéré que le compilateur Typescript vérifie son entrée pour du JavaScript valide et ne fait rien au cas où il trouverait quelque chose. Intuitivement, cela sonne bien. Vous devriez pouvoir «convertir» tout votre JavaScript en Typescript en mettant simplement à jour les extensions de fichier et être prêt à partir. Malheureusement, cela ne fonctionne pas comme prévu. Supposons que vous ayez ce code:

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

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

Edit: Je viens d'essayer de compiler ceci et cela ne fonctionne pas. Je suis désolé, je semble m'être trompé: le compilateur TypeScript n'accepte même pas le JavaScript pur. Je vais essayer de découvrir ce qui ne va pas.

Vous avez changé l'extension de fichier en .ts et utilisez la fonction func dans votre autre code. Au début, tout semble aller bien, mais un vilain bogue apparaît. Vous décidez qu'une vérification de type statique vous aiderait probablement et vous changez le code en:

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

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

Mais maintenant, ce n'est plus du code JavaScript valide et le compilateur générera de nombreux messages d'erreur. Après toutes les données n'ont pas de membre "z". ... Ce comportement pourrait être évité si le type par défaut était toujours "any" mais l'inférence de type serait alors totalement inutile.

Alors, comment résolvez-vous ce problème? La réponse est: les fichiers de déclaration. Vous pouvez utiliser votre code JavaScript "tel quel" dans le projet et toujours obtenir une vérification de type statique à l'aide de quelques fichiers .d.ts. Ils informent le compilateur des variables, méthodes et «classes» déclarées dans un fichier JavaScript, y compris leurs types. Par conséquent, ils permettent une vérification de type à la compilation et une intelligence fantastique. Un fichier .d.ts pour mon exemple serait

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

Enregistrez-le sous "myjsfile.d.ts" et importez-le dans un texte dactylographié avec

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

assurez-vous d'inclure le script JavaScript dans votre fichier html au-dessus du script dactylographié compilé. Voici un lien intéressant . Vous pourriez être intéressé par la section "Transformer JavaScript en TypeScript".


58
+1 pour souligner que tous les JS valides ne sont pas des TS valides.
Ken Smith

14
En fait, tous les extraits de code javascript que vous avez publiés sont des scripts dactylographiés valides. Il vous suffit de désactiver certains commutateurs du compilateur comme --noImplictAny, etc. Cependant, il est judicieux de les activer éventuellement et d'ajouter les annotations de type si nécessaire
Liero

Je vous remercie. Je n'obtiens que des arguments lorsque je dis aux gens que TypeScript n'est pas un sur-ensemble de JavaScript, quel que soit l'exemple que je fournis. Finalement, les gens abandonnent l'argument lorsque je leur montre pourquoi, puis ils argumentent de la même manière la semaine prochaine comme pour oublier la preuve dans le pudding. " tout code JavaScript valide est également un code TypeScript valide ... est tout simplement faux " - LHK
Cody

3
Avec TypeScript permettant la compilation en JavaScript malgré les "erreurs" de TypeScript (dans la version de démonstration actuelle de TypeScript, tous les exemples JavaScript de cette réponse n'ont aucun problème à compiler), cela fonctionne en quelque sorte comme un sur-ensemble - au moins de ces fonctionnalités JavaScript qui le compilateur TypeScript est capable de gérer ...
Brett Zamir

Ouais, j'ai "été des deux côtés" de ce problème. Fondamentalement, TS est un sur-ensemble de JS dans le sens où: TypeScript se plaindra d'un code JS valide, mais tant qu'il noEmitOnErrorest éteint, il est toujours capable d'opérer et d'émettre sa transpilation. Ainsi, s'il affiche des erreurs (ce qui est dérangeant), vous pouvez en fait ignorer ces erreurs et utiliser la transpilation TypeScript malgré cela (permettant, par exemple, une transition progressive de JS à TS). En outre, au moins certaines des erreurs peuvent être désactivées via des commutateurs comme noImplicitAny(peut-être tous, bien que IDK).
Venryx

51

Mise à jour: l' outil est décrit en détails dans cet article

ReSharper à partir de la version 9 ( versions EAP disponibles ) a une fonctionnalité pour convertir automatiquement le code JavaScript en TypeScript. Vous pouvez commencer par renommer le fichier .js en .ts et voir des suggestions R # comme celle-ci:

Je ne l'ai pas essayé sur des exemples du monde réel. Mais il est capable de convertir un grand nombre de modèles JavaScript.


J'adorerais le faire à la volée en utilisant des méta-fichiers édités à la main, créant ainsi tout le ballonnement TS dont il a besoin.
xamiro

Bonjour, j'utilise resharper donc ne renommer que bien de .js en .ts seulement? Comme si j'utilisais un fichier.js et que je renommais le fichier avec a.ts, le resharper donnera des suggestions? J'utilise la version communautaire de Visual Studio et j'ai installé Resharper
Swift

1

Depuis le terminal (mac):

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

Renomme tous les fichiers .js en .ts

C'est un peu ironique - mais comme Benjamin le souligne ci-dessus, les fichiers JavaScript sont du TypeScript valide . Si vous souhaitez ajouter des types, des classes, des interfaces, etc. à votre JavaScript - vous devrez vous-même concevoir et modifier votre code en utilisant ces concepts - il y a peu ou pas de conversion automatique pour cela.

Avec GNU findutils (la plupart des * nixes) + Bash, faites simplement:

find -type f -name '*.js' -exec bash -c 'mv "${1}" "${1%???}.ts"' bash {} \;

10
+1 - c'est un peu comme essayer de reconvertir automatiquement un livre abrégé en version complète.
Fenton

Toutes les informations de type sont supprimées et toutes les interfaces sont supprimées - c'est pas mal d'informations qui ont disparu. Tout JavaScript qui a suffisamment d'informations pour déduire les informations de type peut simplement être déjà collé dans un fichier TypeScript et le compilateur calculera les types, mais il existe de nombreuses instances qui ne fonctionneront pas car le JavaScript n'est pas cohérent.
Fenton

1
Convertir de quoi à quoi? Dériver des types de JS et les ajouter à des variables? Je ne sais pas quoi d'autre pourrait être automatiquement converti, je ne sais pas comment les classes, les interfaces, les modules pourraient être dérivés (correctement).
7zark7

4
Tout le code JavaScript n'est pas valide dans TypeScript, essayez ceci:var a = 5; a = "";
coudy

4
Pour appuyer cela et justifier le vote négatif, vous vous rendrez compte très rapidement que tout le code JS n'est pas valide dans TypeScript lorsque vous essayez de convertir des modules ou des plugins en TypeScript à partir de leur JS natif (par exemple: jquery.address, etc.)
dpb
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.