Esiste uno strumento per convertire i file JavaScript in TypeScript [chiuso]


134

Ora è uscito TypeScript, è una notizia entusiasmante per me, ma come posso convertire tutti i file JavaScript esistenti in TypeScript.


3
Tutti i tuoi file javascript sono già file dattiloscritti poiché dattiloscritto è un superset di javascript.
Benjamin Gruenbaum,

6
Questo è l'opposto di off-topic, la conversione da un linguaggio di programmazione a un altro è TOTALMENTE una domanda di programmazione.
Ivan Castellanos,

2
@Tony_Henrich Bene, questo avrebbe dovuto essere spostato lì invece di "chiuso come offtopic", e tra l'altro tale sito dovrebbe avere una chiara categoria per i consigli software destinati agli ingegneri del software.
Ivan Castellanos,

3
@Tony_Henrich Mettiamola così: questo è il miglior risultato su Internet per "convertire JavaScript in TypeScript" e la cosa migliore che puoi fare è chiuderlo da ulteriori risposte e chiamarlo fuori tema? Penso che un pensiero così ristretto sarà la fine di questo sito.
Ivan Castellanos,

5
ridicolo che questo fosse chiuso come fuori tema.
bharal,

Risposte:


112

Temo che questo sarà molto problematico. TypeScript è un superset di JavaScript . Ciò implica che tutto il codice JavaScript valido è anche un codice TypeScript valido. Che è semplicemente sbagliato. Il codice seguente è corretto in JavaScript, ma crea un errore in TypeScript:

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

È possibile ottenere il comportamento dinamico di JavaScript dichiarando i dati come "ambientali"

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

Ora funzionerà anche in TypeScript. Tuttavia, è possibile modificare l'estensione di un file .js in .ts e passare questo file al compilatore TypeScript. Questo mi ha davvero confuso e ho posto la domanda nel canale IRC TypeScript su freenode. Si è scoperto che il compilatore Typescript controlla il suo input per JavaScript valido e semplicemente non fa nulla nel caso in cui trova qualcosa. Intuitivamente suona bene. Dovresti essere in grado di "convertire" tutto il tuo JavaScript in Typescript semplicemente aggiornando le estensioni dei file ed essere pronto. Purtroppo questo non funziona come previsto. Supponiamo che tu abbia questo codice:

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

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

Modifica: ho appena provato a compilare questo e non funziona. Mi dispiace, mi sembra di essermi sbagliato: il compilatore TypeScript non accetta nemmeno JavaScript puro. Proverò a scoprire cosa è andato storto.

Hai modificato l'estensione del file in .ts e usa la funzione func nell'altro codice. All'inizio tutto sembra a posto ma poi si presenta un brutto bug. Decidi che un controllo statico del tipo potrebbe aiutarti e cambi il codice in:

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

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

Ma ora questo non è più un codice JavaScript valido e farà sì che il compilatore generi molti messaggi di errore. Dopo che tutti i dati non hanno membri "z". ... Questo comportamento potrebbe essere evitato se il tipo predefinito fosse sempre "qualsiasi" ma l'inferenza del tipo sarebbe assolutamente inutile.

Quindi, come risolvi questo problema? La risposta è: file di dichiarazione. È possibile utilizzare il codice JavaScript "così com'è" nel progetto e ottenere comunque il controllo del tipo statico con l'aiuto di alcuni file .d.ts. Informano il compilatore quali variabili, metodi e "classi" sono dichiarati in un file JavaScript, inclusi i loro tipi. Pertanto consentono la verifica del tipo in fase di compilazione e l'intellisense fantastico. Un file .d.ts per il mio esempio sarebbe

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

Salvalo come "myjsfile.d.ts" e importalo in dattiloscritto con

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

assicurati di includere lo script JavaScript nel tuo file html sopra il dattiloscritto compilato. Ecco un link interessante . Potresti essere interessato alla sezione "Trasformare JavaScript in TypeScript".


58
+1 per indicare che non tutti i JS validi sono TS validi.
Ken Smith,

14
In realtà, tutti gli snippet javascript che hai pubblicato sono dattiloscritti validi. Devi solo disattivare alcuni switch del compilatore come --noImplictAny, ecc. Tuttavia, è una buona idea attivarli alla fine e aggiungere le annotazioni del tipo dove richiesto
Liero,

Grazie. Non ho altro che argomentazioni quando dico alle persone che TypeScript non è un superset di JavaScript, indipendentemente dall'esempio che fornisco. Alla fine le persone rinunciano all'argomento quando mostro loro il perché, e poi discutono lo stesso la settimana successiva come se volessero dimenticare la prova nel budino. " tutto il codice JavaScript valido è anche un codice TypeScript valido ... è semplicemente sbagliato " - LHK
Cody

3
Con TypeScript che consente la compilazione in JavaScript nonostante gli "errori" di TypeScript (nell'attuale versione demo di TypeScript tutti gli esempi JavaScript in questa risposta non hanno problemi di compilazione), in qualche modo funziona come un superset - almeno di quelle funzionalità JavaScript che il compilatore TypeScript è in grado di gestire ...
Brett Zamir,

Sì, sono stato "da entrambe le parti" di questo problema. Fondamentalmente, TS è un superset di JS, nel senso che: TypeScript si lamenterà di un codice JS valido, ma finché noEmitOnErrorè spento, è ancora in grado di funzionare ed emettere il suo transpilation. Pertanto, mentre mostra errori (il che disturba), puoi effettivamente ignorarli e usare la transpilazione TypeScript nonostante (permettendo, ad esempio, il passaggio graduale da JS a TS). Inoltre, almeno alcuni degli errori possono essere disabilitati tramite switch come noImplicitAny(forse tutti, anche se IDK).
Venryx,

51

Aggiornamento: lo strumento è descritto in dettaglio in questo post

ReSharper a partire dalla versione 9 ( build EAP disponibili ) ha funzionalità per convertire automaticamente il codice JavaScript in TypeScript. Puoi iniziare rinominando il file .js in .ts e vedere i suggerimenti di R # come questo:

Non l'ho provato su esempi del mondo reale. Ma è in grado di convertire un gran numero di modelli JavaScript.


Mi piacerebbe farlo al volo usando meta file modificati a mano, creando tutto il gonfiore di cui ha bisogno.
Xamiro,

Ciao, sto usando resharper, quindi solo rinominare bene da .js a .ts? Come se stessi usando il file a.js e rinominando il file con a.ts il resharper darà qualche suggerimento? Sto usando la versione della community di Visual Studio e ho installato Resharper
Swift il

1

Dal terminale (mac):

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

Rinomina tutti i file .js in .ts

Questo è un po 'ironico, ma come sottolinea Benjamin sopra i file JavaScript sono TypeScript validi . Se vuoi aggiungere tipi, classi, interfacce, ecc. Al tuo JavaScript - dovrai tu stesso progettare e cambiare il tuo codice usando questi concetti - c'è poca / nessuna conversione automatica per questo.

Con GNU findutils (la maggior parte dei * nix) + Bash, basta fare:

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

10
+1: è un po 'come provare a convertire automaticamente un libro abbreviato nella versione completa.
Fenton,

Tutte le informazioni sul tipo vengono rimosse e tutte le interfacce vengono rimosse: sono rimaste molte informazioni. Qualsiasi JavaScript che abbia abbastanza informazioni per inferire le informazioni sul tipo può essere appena incollato in un file TypeScript e il compilatore elaborerà i tipi, ma ci sono molte istanze che non funzioneranno perché JavaScript non è coerente.
Fenton,

1
Converti da cosa a cosa però? Derivare i tipi da JS e aggiungerli a VAR? Non sono sicuro di cos'altro possa essere convertito automaticamente, non sono sicuro di come le classi, le interfacce, i moduli possano essere derivati ​​(in modo sicuro).
7zark7,

4
Non tutto il codice JavaScript è valido in TypeScript, prova questo:var a = 5; a = "";
coudy

4
In secondo luogo, e giustificando il downvote, ti renderai conto molto rapidamente che non tutto il codice JS è valido in TypeScript quando provi a convertire moduli o plugin in TypeScript dal loro JS nativo (ad esempio: jquery.address, ecc)
dpb
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.