Apakah ada alat untuk mengkonversi file JavaScript ke TypeScript [ditutup]

133

Sekarang TypeScript keluar, ini adalah berita yang menarik bagi saya, tetapi bagaimana saya bisa mengonversi semua file JavaScript yang ada ke TypeScript.

Gisway
sumber
3
Semua file javascript Anda sudah menjadi file naskah karena naskah adalah superset dari javascript.
Benjamin Gruenbaum
6
Ini kebalikan dari off-topic, mengubah dari satu bahasa pemrograman ke yang lain adalah BENAR-BENAR pertanyaan pemrograman.
Ivan Castellanos
2
@ Tony_Henrich Kalau begitu ini seharusnya sudah dipindahkan ke sana daripada "ditutup sebagai offtopic", dan btw situs tersebut harus memiliki kategori yang jelas untuk rekomendasi perangkat lunak yang ditujukan untuk insinyur perangkat lunak.
Ivan Castellanos
3
@ Tony_Henrich Mari kita begini: Ini adalah hasil teratas di internet untuk "mengkonversi JavaScript ke TypeScript" dan hal terbaik yang dapat Anda lakukan adalah menutupnya dari jawaban lebih lanjut dan menyebutnya di luar topik? Saya pikir pemikiran sempit seperti itu akan menjadi penghancuran situs ini.
Ivan Castellanos
5
konyol bahwa ini ditutup sebagai topik.
bharal

Jawaban:

112

Saya khawatir ini akan sangat bermasalah. TypeScript adalah superset dari JavaScript . Ini menyiratkan bahwa semua kode JavaScript yang valid juga merupakan kode TypeScript yang valid. Yang salah saja. Kode berikut ini benar dalam JavaScript, tetapi membuat kesalahan dalam TypeScript:

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

Anda bisa mendapatkan perilaku dinamis JavaScript dengan mendeklarasikan data sebagai "ambient"

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

Sekarang ini akan bekerja di TypeScript juga. Namun demikian Anda dapat mengubah ekstensi file .js ke .ts dan meneruskan file ini ke kompiler TypeScript. Ini benar-benar membingungkan saya dan saya mengajukan pertanyaan di saluran IRC TypeScript di freenode. Ternyata kompiler Typecript memeriksa inputnya untuk JavaScript yang valid dan tidak melakukan apa-apa seandainya ia menemukan sesuatu. Secara intuitif ini terdengar bagus. Anda harus dapat "mengkonversi" semua JavaScript Anda ke dalam Script dengan hanya memperbarui ekstensi file dan baik untuk pergi. Sayangnya ini tidak berfungsi seperti yang diharapkan. Mari kita asumsikan Anda punya kode ini:

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

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

Sunting: Saya baru saja mencoba untuk mengkompilasi ini dan tidak berhasil. Maaf, sepertinya saya salah: Kompiler TypeScript bahkan tidak menerima JavaScript murni. Saya akan mencoba mencari tahu apa yang salah.

Anda telah mengubah ekstensi file menjadi .ts dan menggunakan fungsi func di kode Anda yang lain. Pada awalnya semuanya tampak baik-baik saja tetapi kemudian bug jelek muncul. Anda memutuskan bahwa beberapa pemeriksaan tipe statis mungkin akan membantu Anda dan Anda mengubah kode menjadi:

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

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

Tapi sekarang ini tidak lagi kode JavaScript yang valid dan akan menyebabkan kompiler menghasilkan banyak pesan kesalahan. Setelah semua data tidak memiliki anggota "z". ... Perilaku ini dapat dihindari jika tipe default selalu "ada" tetapi kemudian inferensi tipe akan sama sekali tidak berguna.

Jadi bagaimana Anda mengatasi masalah ini? Jawabannya adalah: file deklarasi. Anda dapat menggunakan kode JavaScript "sebagaimana adanya" dalam proyek dan masih mendapatkan pemeriksaan jenis statis dengan bantuan beberapa file .d.ts. Mereka memberi tahu kompilator variabel, metode, dan "kelas" apa yang dideklarasikan dalam file JavaScript, termasuk tipenya. Oleh karena itu mereka memungkinkan untuk pengecekan tipe waktu kompilasi dan kecerdasan yang fantastis. File .d.ts untuk contoh saya adalah

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

Simpan ini sebagai "myjsfile.d.ts" dan impor ke naskah dengan

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

pastikan untuk memasukkan skrip JavaScript dalam file html Anda di atas skrip yang dikompilasi. Inilah tautan yang menarik . Anda mungkin tertarik pada bagian "Mengubah JavaScript menjadi TypeScript".

lhk
sumber
57
+1 untuk menunjukkan bahwa tidak semua JS yang valid adalah TS yang valid.
Ken Smith
14
Sebenarnya, semua cuplikan javascript yang Anda poskan adalah naskah jenis yang valid. Anda hanya perlu mematikan beberapa sakelar kompiler seperti --noImplictAny, dll. Namun, ide yang bagus untuk mengaktifkannya akhirnya dan menambahkan jenis anotasi jika diperlukan
Liero
Terima kasih. Saya tidak mendapatkan apa-apa selain argumentasi ketika saya memberi tahu orang-orang bahwa TypeScript bukan superset dari JavaScript, tidak peduli apa pun contoh yang saya berikan. Akhirnya orang-orang menyerah pada argumen ketika saya tunjukkan alasannya, dan kemudian mereka berdebat sama minggu berikutnya seolah-olah melupakan bukti dalam puding. " semua kode JavaScript yang valid juga kode TypeScript yang valid ... salah " - LHK
Cody
3
Dengan TypeScript memungkinkan kompilasi ke dalam JavaScript meskipun "kesalahan" TypeScript (dalam versi demo saat ini dari TypeScript semua contoh JavaScript dalam jawaban ini tidak memiliki masalah mengkompilasi), itu semacam berfungsi sebagai superset - setidaknya dari fitur JavaScript yang kompiler TypeScript mampu menangani ...
Brett Zamir
Ya, saya sudah "berada di kedua sisi" masalah ini. Pada dasarnya, TS adalah superset dari JS dalam arti bahwa: TypeScript akan mengeluh tentang beberapa kode JS yang valid, tetapi selama noEmitOnErrortidak aktif, ia masih dapat beroperasi dan memancarkan transpilasinya. Jadi, sementara itu menunjukkan kesalahan (yang mengganggu), Anda benar-benar dapat mengabaikan kesalahan itu dan menggunakan transpilasi TypeScript meskipun itu (memungkinkan, misalnya, transisi bertahap dari JS ke TS). Juga, setidaknya beberapa kesalahan dapat dinonaktifkan melalui sakelar seperti noImplicitAny(mungkin semua, meskipun IDK).
Venryx
51

Pembaruan: Alat dijelaskan secara rinci dalam pos ini

ReSharper dimulai dengan versi 9 ( EAP builds available ) memiliki fungsi untuk secara otomatis mengkonversi kode JavaScript ke dalam TypeScript. Anda dapat mulai dengan mengubah nama file .js menjadi .ts dan melihat saran R # seperti ini:

Belum mencobanya di contoh dunia nyata. Tetapi ia mampu mengubah sejumlah besar pola JavaScript.

Shkredov S.
sumber
Saya ingin melakukan ini dengan cepat dengan menggunakan file meta yang diedit dengan tangan, membuat semua TS mengasapi yang dibutuhkan.
xamiro
Halo, saya menggunakan resharper jadi hanya mengganti nama baik dari .js menjadi .ts saja? Seperti saya menggunakan file a.js dan mengganti nama file dengan a.ts apakah resharper akan memberikan saran? Saya menggunakan versi komunitas studio visual dan menginstal Resharper
Swift
1

Dari terminal (mac):

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

Mengganti nama semua file .js menjadi .ts

Ini agak membingungkan , tetapi seperti yang ditunjukkan Benjamin di atas, file JavaScript adalah TypeScript yang valid . Jika Anda ingin menambahkan tipe, kelas, antarmuka, dll ke JavaScript Anda - Anda sendiri harus merancang dan mengubah kode Anda menggunakan konsep-konsep ini - ada sedikit / tidak ada konversi otomatis untuk ini.

Dengan GNU findutils (kebanyakan * nixes) + Bash, lakukan saja:

find -type f -name '*.js' -exec bash -c 'mv "${1}" "${1%???}.ts"' bash {} \;
7zark7
sumber
10
+1 - ini seperti mencoba mengubah buku ringkasan menjadi versi lengkap secara otomatis.
Fenton
Semua jenis informasi dihapus dan semua antarmuka dihapus - itu cukup banyak informasi yang hilang. Setiap JavaScript yang memiliki informasi yang cukup untuk menyimpulkan informasi jenis hanya dapat disisipkan ke dalam file TypeScript dan kompiler akan mengetahui jenisnya, tetapi ada banyak contoh yang tidak akan berfungsi karena JavaScript tidak konsisten.
Fenton
1
Konversi dari apa ke apa? Turunkan tipe dari JS dan menambahkannya ke vars? Tidak yakin apa lagi yang bisa dikonversi secara otomatis, tidak yakin bagaimana kelas, antarmuka, modul dapat diturunkan (secara waras).
7zark7
4
Tidak semua kode JavaScript valid dalam TypeScript, coba ini:var a = 5; a = "";
coudy
4
Untuk yang kedua itu, dan membenarkan downvote, Anda akan menyadari dengan sangat cepat bahwa tidak semua kode JS valid dalam TypeScript ketika Anda mencoba untuk mengkonversi modul atau plugin ke TypeScript dari JS asli mereka (mis .: jquery.address, dll)
dpb