C’è uno strumento per convertire i file JavaScript in TypeScript

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

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

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

Puoi ottenere il comportamento dinamico di JavaScript dichiarando i dati come “ambient”

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

Ora funzionerà anche in TypeScript. Tuttavia è ansible modificare l’estensione di un file .js in .ts e passare questo file al compilatore TypeScript. Questo mi ha davvero confuso e ho fatto la domanda nel canale IRC TypeScript su freenode. Si è scoperto che il compilatore Typescript verifica il suo input per JavaScript valido e non fa nulla nel caso in cui trovi qualcosa. Intuitivamente questo suona bene. Dovresti essere in grado di “convertire” tutto il tuo JavaScript in Typescript semplicemente aggiornando le estensioni dei file ed è bello andare. Sfortunatamente questo non funziona come previsto. Supponiamo che tu abbia questo codice:

 var func=function(n){alert(n)}; var data={x:5}; data.z=6; 

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

Hai cambiato l’estensione del file in .ts e usa la funzione func nel tuo altro codice. All’inizio sembra tutto a posto, ma poi arriva un brutto insetto. Decidi che un controllo di tipo statico potrebbe aiutarti e puoi cambiare il codice in:

 var func=function(n:string){alert(n)}; var data={x:5}; data.z=6; 

Ma ora questo codice JavaScript non è più valido e farà sì che il compilatore generi molti messaggi di errore. Dopo tutti i dati non ha membro “z”. … Questo comportamento potrebbe essere evitato se il tipo predefinito fosse sempre “qualsiasi”, ma poi l’inferenza di tipo sarebbe completamente inutile.

Quindi come risolvi questo problema? La risposta è: file di dichiarazione. È ansible utilizzare il codice JavaScript “così com’è” nel progetto e ottenere comunque il controllo statico del tipo 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 il controllo del tipo in fase di compilazione e una fantastica intelligenza. Un file .d.ts per il mio esempio sarebbe

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

Salva questo come “myjsfile.d.ts” e importalo in typescript con

 /// 

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

Aggiornamento: lo strumento è descritto in dettaglio in questo post

ReSharper che inizia con la versione 9 ( build EAP disponibili ) ha funzionalità per convertire automaticamente il codice JavaScript in TypeScript. Puoi iniziare con rinominare il file .js in .ts e vedere i suggerimenti R # come questo:

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

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 Benjamin fa notare sopra i file JavaScript sono validi TypeScript . Se vuoi aggiungere tipi, classi, interfacce, ecc. Al tuo JavaScript, dovrai progettare e modificare il tuo codice usando questi concetti – per questo non vi è alcuna conversione automatica.

Con GNU findutils (più * nix) + Bash, basta fare:

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