JavaScript dosyalarını TypeScript'e [kapalı] dönüştürmek için bir araç var mı


134

Şimdi TypeScript çıktı, benim için heyecan verici bir haber ama var olan tüm JavaScript dosyalarını TypeScript'e nasıl dönüştürebilirim.


3
TypeScript, javascript'in üst kümesi olduğundan, tüm javascript dosyalarınız zaten typcript dosyalarıdır.
Benjamin Gruenbaum

6
Bu konu dışı olmanın tam tersidir, bir programlama dilinden diğerine dönüştürmek TAMAMEN bir programlama sorusudur.
Ivan Castellanos

2
@Tony_Henrich O zaman bu "konu dışı kapalı" yerine oraya taşınmalıydı ve btw böyle bir site, yazılım mühendislerine yönelik yazılım önerileri için açık bir kategoriye sahip olmalıdır.
Ivan Castellanos

3
@Tony_Henrich Bunu şöyle ifade edelim: Bu, "JavaScript'i TypeScript'e dönüştürmek" için internetteki en iyi sonuçtur ve yapabileceğiniz en iyi şey, onu diğer yanıtlardan kapatmak ve konu dışı olarak adlandırmak mı? Bu kadar dar düşünmenin bu sitenin ölümü olacağını düşünüyorum.
Ivan Castellanos

5
bunun konu dışı olarak kapatılması gülünç.
bharal

Yanıtlar:


112

Bunun çok sorunlu olacağından korkuyorum. TypeScript, JavaScript'in bir üst kümesidir . Bu, tüm geçerli JavaScript kodunun aynı zamanda geçerli TypeScript kodu olduğu anlamına gelir. Ki bu çok yanlış. Aşağıdaki kod JavaScript'te doğrudur, ancak TypeScript'te bir hata oluşturur:

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

Verileri "ortam" olarak bildirerek JavaScript'in dinamik davranışını elde edebilirsiniz.

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

Şimdi bu TypeScript'te de çalışacak. Bununla birlikte, bir .js dosyasının uzantısını .ts olarak değiştirebilir ve bu dosyayı TypeScript derleyicisine iletebilirsiniz. Bu gerçekten kafamı karıştırdı ve soruyu Freenode'daki TypeScript IRC kanalında sordum. Typescript derleyicisinin girdisini geçerli JavaScript için kontrol ettiği ve bir şey bulması durumunda hiçbir şey yapmadığı ortaya çıktı. Sezgisel olarak bu kulağa hoş geliyor. Yalnızca dosya uzantılarını güncelleyerek tüm JavaScript'inizi Typescript'e "dönüştürebilmelisiniz" ve kullanıma hazır olmalısınız. Maalesef bu beklendiği gibi çalışmıyor. Bu koda sahip olduğunuzu varsayalım:

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

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

Düzenleme: Bunu derlemeye çalıştım ve işe yaramıyor. Üzgünüm, yanılmışım gibi görünüyor: TypeScript derleyicisi saf JavaScript'i bile kabul etmiyor. Neyin yanlış gittiğini bulmaya çalışacağım.

Dosya uzantısını .ts olarak değiştirdiniz ve diğer kodunuzda func işlevini kullandınız. İlk başta her şey yolunda görünüyor ama sonra çirkin bir böcek ortaya çıkıyor. Bazı statik tür kontrolünün muhtemelen size yardımcı olacağına karar verirsiniz ve kodu şu şekilde değiştirirsiniz:

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

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

Ancak artık bu geçerli bir JavaScript kodu değildir ve derleyicinin çok sayıda hata mesajı oluşturmasına neden olacaktır. Sonuçta verilerin "z" üyesi yok. ... Varsayılan tür her zaman "herhangi" ise, ancak bu durumda tür çıkarımı tamamen işe yaramazsa, bu davranış önlenebilir.

Peki bu sorunu nasıl çözersiniz? Cevap: beyanname dosyaları. JavaScript kodunuzu projede "olduğu gibi" kullanabilir ve yine de birkaç .d.ts dosyası yardımıyla statik tür kontrolünü alabilirsiniz. Bir JavaScript dosyasında, türleri dahil olmak üzere hangi değişkenlerin, yöntemlerin ve "sınıfların" bildirildiğini derleyiciye bildirirler. Bu nedenle, derleme zamanı tür kontrolüne ve fantastik zekaya izin verir. Örneğim için bir .d.ts dosyası

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

Bunu "myjsfile.d.ts" olarak kaydedin ve typecript'e aktarın.

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

JavaScript komut dosyasını html dosyanıza derlenmiş typcript'in üzerine eklediğinizden emin olun. İşte ilginç bir bağlantı . "JavaScript'i TypeScript'e Dönüştürme" bölümü ilginizi çekebilir.


58
Tüm geçerli JS'nin geçerli TS olmadığına işaret eden +1.
Ken Smith

14
Aslında, gönderdiğiniz tüm javascript pasajları geçerli tip komutlardır. Sadece --noImplictAny, vb. Gibi bazı derleyici anahtarlarını kapatmanız gerekir. Ancak, sonunda bunları açmak ve gerektiğinde tür ek açıklamalarını eklemek iyi bir fikirdir
Liero

Teşekkür ederim. Hangi örneği verirsem vereyim, insanlara TypeScript'in JavaScript'in bir üst kümesi olmadığını söylediğimde argümantasyondan başka bir şey almıyorum. Sonunda, nedenini onlara gösterdiğimde insanlar tartışmadan vazgeçiyorlar ve sonra tıpkı önümüzdeki hafta muhallebideki ispatı unutuyormuş gibi aynı şeyi tartışıyorlar. " tüm geçerli JavaScript kodları da geçerli TypeScript kodudur ... sadece yanlış " - LHK
Cody 18

3
TypeScript, TypeScript "hatalarına" rağmen JavaScript'te derlemeye izin verdiğinden (TypeScript'in mevcut demo sürümünde, bu yanıttaki tüm JavaScript örneklerinin derleme sorunu yoktur), bir tür süper set olarak çalışır - en azından JavaScript özelliklerinden TypeScript derleyicisi ...
Brett Zamir

Evet, bu konunun "her iki tarafında da bulundum". Temel olarak TS, şu anlamda JS'nin bir üst kümesidir: TypeScript, bazı geçerli JS kodlarından şikayet eder, ancak noEmitOnErrorkapalı olduğu sürece , yine de aktarımını çalıştırabilir ve yayabilir. Böylece, (rahatsız edici olan) hataları gösterirken, bu hataları gerçekten göz ardı edebilir ve buna rağmen TypeScript transpilasyonunu kullanabilirsiniz (örneğin, JS'den TS'ye kademeli geçişe izin verir). Ayrıca, hataların en azından bazıları gibi anahtarlar aracılığıyla devre dışı bırakılabilir noImplicitAny(belki hepsi IDK olsa da).
Venryx

51

Güncelleme: Araç, bu yayında ayrıntılı olarak açıklanmıştır

Sürüm 9'dan başlayan ReSharper ( EAP yapıları mevcuttur ), JavaScript kodunu otomatik olarak TypeScript'e dönüştürme işlevine sahiptir. .Js dosyasını .ts olarak yeniden adlandırarak başlayabilir ve bunun gibi R # önerilerini görebilirsiniz:

Bunu gerçek dünya örneklerinde denemedim. Ancak çok sayıda JavaScript modelini dönüştürebilir.


Bunu, elle düzenlenmiş meta dosyaları kullanarak, ihtiyaç duyduğu tüm TS bloatını oluşturarak yapmak isterim.
xamiro

Merhaba, resharper kullanıyorum, bu yüzden yalnızca ince ayarını .js'den .ts olarak mı yeniden adlandırıyorum? Bir.js dosyası kullanıyorum ve dosyayı yeniden adlandırdığım gibi, a.ts yeniden paylaşım herhangi bir öneride bulunacak mı? Visual Studio topluluğu sürümünü kullanıyorum ve Resharper
Swift

1

Terminalden (mac):

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

Tüm .js dosyalarını .ts olarak yeniden adlandırır

Bu biraz yanak dilidir - ancak Benjamin'in yukarıda işaret ettiği gibi JavaScript dosyaları geçerli TypeScript'tir . JavaScript'inize türler, sınıflar, arayüzler vb. Eklemek istiyorsanız - bu kavramları kullanarak kodunuzu kendiniz tasarlamanız ve değiştirmeniz gerekecektir. - bunun için çok az otomatik dönüşüm vardır / hiç yoktur.

GNU findutils (çoğu * nix) + Bash ile şunları yapın:

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

10
+1 - bu biraz kısaltılmış bir kitabı otomatik olarak tam sürüme dönüştürmeye benzer.
Fenton

Tüm tür bilgileri kaldırılır ve tüm arabirimler kaldırılır - bu oldukça fazla bilgi gitti. Tür bilgisini çıkarmak için yeterli bilgiye sahip herhangi bir JavaScript, bir TypeScript dosyasına zaten yapıştırılabilir ve derleyici türleri hesaplayacaktır, ancak JavaScript tutarlı olmadığı için çalışmayan birçok örnek vardır.
Fenton

1
Neye dönüştüğünü yine de? JS'den türler türetmek ve bunları değişkenlere eklemek mi? Başka neyin otomatik olarak dönüştürülebileceğinden emin değilim, sınıfların, arayüzlerin, modüllerin nasıl türetilebileceğinden (mantıklı) emin değilim.
7zark7

4
TypeScript'te tüm JavaScript kodları geçerli değildir, şunu deneyin:var a = 5; a = "";
coudy

4
İkinci olarak ve olumsuz oyu haklı çıkarmak için, modülleri veya eklentileri yerel JS'lerinden TypeScript'e dönüştürmeye çalıştığınızda tüm JS kodunun TypeScript'te geçerli olmadığını çok çabuk anlayacaksınız (örneğin: jquery.address, vb.)
dpb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.