9

私の nodejs Typescript サーバーは複雑になり、別の .ts ファイルで定義されたいくつかのクラスに依存するようになりました。これにより、奇妙なコンパイルの問題が発生しました。

  • tsc server.tsすべてをうまくコンパイルします。ただしnode server.js、他の .ts ファイルからクラスをインスタンス化する最初の行でクラッシュします

  • tsc --out server.js server.tsエラーメッセージが表示されます:「モジュールの発行は、発行されたスクリプトと衝突します」

  • tsc --out serv.js server.ts動作しているように見えますが、実際には server.ts を除くすべてをコンパイルします。他のファイルからのコードはそこにあり、node serv.js何も出力せずに戻ります

このエラーが発生したのは私だけではありません。 https://typescript.codeplex.com/workitem/294残念ながら、codeplex のソリューションは機能しません。

tsc正しく使用するにはどうすればよいですか?

4

2 に答える 2

16

依存関係は、最上位のディレクティブを使用server.tsして表面積をエクスポートするモジュールである必要があり、ディレクティブを使用してそれらをロードする必要があります。ここでの根本的な原因は、TypeScriptにはコンパイル用の2つの異なる種類のユニバースがあることです。exportserver.tsimport

1つ目は、通常のWebページで使用するデフォルトのファイルで、単純なローダーが1つ以上のソースファイルを一定の順序で取得してその順序で実行し、依存関係の順序を自分で決定します。これは「プログラム」コンパイルと呼ばれます。プログラムのコンパイルでは、サイドバイサイドコンパイル(a.ts => a.js、b.ts => b.js)を実行するか、--out((a.ts + b.ts)を使用して連結コンパイルを実行します。 => out.js)。

プログラムのコンパイルでは、///<reference>タグを使用して参照を参照します。これらの参照がソースファイル(.ts)を参照している場合、を使用している場合は出力に連結され、そうでない場合--outはサイドバイサイド.jsファイルとして出力されます。これらの参照が宣言ファイル(.d.ts)に対するものである場合、基本的には、外部ローダー(つまり<script>、ブラウザーのタグ)を介してロードされたファイルの定義を取得することを意味します。

2つ目は、実行時の依存関係を解決して非同期またはべき等のモジュール読み込みを行うnode.jsまたはその他の環境で使用する種類のコンパイルです。これは「モジュール」コンパイルと呼ばれます。ここでは、--module渡すフラグがtsc重要であり、モジュールとして単一のファイルをロードすることは(一般的に)node.jsなどのモジュールローダーがどのように機能するかであるため、実行する唯一の有効なことはサイドバイサイドコンパイルです。

モジュールのコンパイルでは、最上位オブジェクト(関数、クラス、モジュール、インターフェイス、または変数)でキーワードを使用して、を使用してexport参照するコードで使用できるものを制御しますimport。モジュールベースのランタイムローダーには、ネイキッドJSファイルをロードするという概念がないため、宣言ファイル/// <reference>を指すタグのみを使用する必要があります。.d.tsでコンパイルすることはできません--out

単に機能しないため、これらのコンパイルモードを組み合わせて使用​​することは絶対に避けてください。実際、0.8.2.0では、tscこれを実行しようとすると、単にエラーが発生します。

于 2013-01-12T00:15:59.390 に答える
0

多くの TypeScript ファイルを含む Web アプリがあります。この問題を解決した方法は次のとおりです。

  1. ~/Scripts ディレクトリにグローバル _references.ts ファイルを作成しました。このファイルには、Web プロジェクト内の各 ts ファイルの参照パス =...があります。
  2. 次に、手動で管理するのが面倒になったため、T4 テンプレートを使用してこのファイルを生成しました。
  3. また、T4 テンプレートを使用して、TypeScript の依存関係に従って_references.ts内の参照を並べ替えました。たとえば、上部にあるすべての ..Base.ts ファイル。
  4. また、-out app.js で始まり、その後にプロジェクト内のすべての ts ファイルのリストが続く tsc 引数ファイルを作成しました。これも T4 を使用して生成され、app.tsprojと呼びました。
  5. 最後に、tsc @app.tsprojを呼び出して、すべての依存関係が正しく順序付けられた JavaScript を生成します。

_references.ts T4 テンプレート: https://gist.github.com/danabenson/5224712

app.tsproj T4 テンプレート: https://gist.github.com/danabenson/5224718

于 2013-03-22T21:03:58.247 に答える