JavaScriptファイルをTypeScriptに変換するツールはありますか[終了]


133

TypeScriptがリリースされました。これは私にとってエキサイティングなニュースですが、既存のすべてのJavaScriptファイルをTypeScriptに変換するにはどうすればよいですか。


3
typescriptはjavascriptのスーパーセットであるため、すべてのjavascriptファイルは既にtypescriptファイルです。
Benjamin Gruenbaum 2013年

6
これはトピック外の反対であり、あるプログラミング言語から別のプログラミング言語への変換は完全にプログラミングの問題です。
Ivan Castellanos

2
@Tony_Henrichさて、これは「オフトピックとして閉じられた」のではなく、そこに移動されるべきでしたが、そうしたサイトには、ソフトウェアエンジニア向けのソフトウェア推奨事項の明確なカテゴリがあるはずです。
Ivan Castellanos

3
@Tony_Henrichこのように言いましょう:これは「JavaScriptをTypeScriptに変換する」というインターネット上での最高の結果であり、あなたができる最善のことはそれをさらなる回答から閉じてトピック外と呼ぶことです?そんな狭い考えがこのサイトの終焉になると思います。
イワンCastellanosの

5
これがオフトピックとしてクローズされたことはばかげています。
bharal

回答:


112

これは非常に問題になると思います。TypeScriptはJavaScriptのスーパーセットです。これは、すべての有効なJavaScriptコードが有効なTypeScriptコードでもあることを意味します。これは間違っています。次のコードはJavaScriptでは正しいですが、TypeScriptでエラーが発生します。

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

データを「アンビエント」として宣言することで、JavaScriptの動的な動作を取得できます

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

これはTypeScriptでも動作します。それでも、.jsファイルの拡張子を.tsに変更して、このファイルをTypeScriptコンパイラに渡すことができます。これは本当に混乱し、freenodeのTypeScript IRCチャネルで質問しました。Typescriptコンパイラは有効なJavaScriptの入力をチェックし、何かを見つけた場合には何もしないことがわかりました。直感的にこれはいいですね。ファイル拡張子を更新するだけで、すべてのJavaScriptをTypescriptに「変換」できるはずです。残念ながら、これは期待どおりに機能しません。次のコードがあるとします。

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

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

編集:これをコンパイルしようとしたところ、うまくいきません。申し訳ありませんが、誤解されているようです。TypeScriptコンパイラは純粋なJavaScriptさえ受け入れません。何が問題だったかを調べてみます。

ファイル拡張子を.tsに変更し、他のコードで関数funcを使用しました。最初はすべて正常に見えますが、醜いバグが発生します。静的型チェックがおそらく役立つと判断し、コードを次のように変更します。

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

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

ただし、これは有効なJavaScriptコードではなくなり、コンパイラーが大量のエラーメッセージを生成するようになります。結局、データにはメンバー "z"がありません。...この動作は、デフォルトのタイプが常に「任意」である場合は回避できますが、タイプの推論はまったく役に立ちません。

では、この問題をどのように解決しますか? 答えは、宣言ファイルです。JavaScriptコードを「そのまま」プロジェクトで使用し、いくつかの.d.tsファイルを使用して静的型チェックを実行できます。これらは、JavaScriptのファイルで宣言されている変数、メソッド、および「クラス」を、それらのタイプを含めてコンパイラーに通知します。したがって、それらはコンパイル時の型チェックと素晴らしいインテリセンスを可能にします。私の例の.d.tsファイルは次のようになります

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

これを「myjsfile.d.ts」として保存し、typescriptにインポートします。

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

コンパイルしたtypescriptの上にあるhtmlファイルにJavaScriptスクリプトを必ず含めてください。ここに興味深いリンクがあります。「JavaScriptをTypeScriptに変換する」セクションに興味があるかもしれません。


57
すべての有効なJSが有効なTSであるとは限らないことを示すための+1。
ケン・スミス

14
実際、投稿したすべてのJavaScriptスニペットは有効なタイプスクリプトです。--noImplictAnyなどのコンパイラスイッチをオフにする必要があるだけです。ただし、最終的にオンにして、必要に応じて型注釈を追加することをお勧めします
Liero

ありがとうございました。TypeScriptはJavaScriptのスーパーセットではないことを伝えると、どのような例を提供しても、私は議論しか得られません。結局のところ、私が理由を示すとき、人々は議論をあきらめ、そして彼らは来週も、プリンの証拠を忘れるかのように同じように主張します。「すべての有効なJavaScriptコードは有効なTypeScriptコードでもあります...は間違っています」-LHK
Cody

3
TypeScriptは、TypeScriptの「エラー」にもかかわらず、JavaScriptへのコンパイルを許可します(TypeScriptの現在のデモバージョンでは、この回答のJavaScriptの例はすべてコンパイルに問題はありません)。スーパーセットとして機能します。 TypeScriptコンパイラーは次の処理を行うことができます...
Brett Zamir

ええ、私はこの問題の「両側になって」います。基本的に、TSは次の意味でJSのスーパーセットですnoEmitOnError。TypeScriptは有効なJSコードについて文句を言うが、オフになっている限り、操作を実行してトランスパイレーションを出力できます。したがって、エラーが表示されます(邪魔です)が、実際にそれらのエラーを無視して、それにもかかわらずTypeScriptトランスパイレーションを使用できます(たとえば、JSからTSへの段階的な移行を可能にします)。また、少なくとも一部のエラーはnoImplicitAny(おそらくIDKを除いてすべて)などのスイッチを使用して無効にできます。
Venryx

51

更新:ツールはこの投稿で詳細に説明されています

バージョン9(EAPビルドが利用可能)以降のReSharperには、JavaScriptコードをTypeScriptに自動的に変換する機能があります。まず、.jsファイルの名前を.tsに変更し、次のようなR#の提案を確認します。

実際の例では試していません。ただし、多数のJavaScriptパターンを変換できます。


手作業で編集したメタファイルを使用して、必要なTSブロートをすべて作成し、その場でこれを実行したいと思います。
xamiro 2016年

こんにちは、私はresharperを使用しているので、.jsから.tsにのみ名前を変更するだけですか?私がa.jsファイルを使用していて、a.tsがreharperであるファイルの名前を変更すると、何か提案がありますか?私はビジュアルスタジオコミュニティバージョンを使用していて、Resharperをインストールしています
Swift

1

端末から(mac):

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

すべての.jsファイルの名前を.tsに変更します

これはややこじんまりですが、Benjaminが上記で指摘したように、JavaScriptファイルは有効なTypeScriptです。タイプ、クラス、インターフェースなどをJavaScriptに追加する場合は、これらの概念を使用してコードを設計および変更する必要があります。これには自動変換がほとんどまたはまったくありません。

GNU findutils(ほとんどの* nixes)+ Bashの場合は、次のようにします。

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

10
+1-要約された本を完全版に自動的に変換しようとするようなものです。
フェントン

すべてのタイプ情報が削除され、すべてのインターフェースが削除されます-これはかなり多くの情報が失われています。タイプ情報を推測するのに十分な情報を持つJavaScriptは、TypeScriptファイルに既に貼り付けるだけで、コンパイラーがタイプを処理しますが、JavaScriptが一貫していないために機能しないインスタンスがたくさんあります。
フェントン

1
しかし、何から何に変換しますか?JSから型を派生させ、それらを変数に追加しますか?他に何が自動的に変換されるのか、クラス、インターフェイス、モジュールがどのようにして(正しく)派生するのかがわかりません。
7zark7 2013年

4
:すべてのJavaScriptコードは、活字体で有効な、この試すvar a = 5; a = "";
coudy

4
次に、反対投票を正当化すると、モジュールまたはプラグインをネイティブJS(例:jquery.addressなど)からTypeScriptに変換しようとすると、すべてのJSコードがTypeScriptで有効であるとは限らないことがすぐにわかります
dpb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.