# outFile caution

以下の理由から、これを使用するのは良くない考えです：

* ランタイムエラー
* 高速コンパイル
* グローバルスコープ
* 分析しづらさ
* スケールしづらさ
* `_references`
* コードの再利用性
* 複数のターゲット
* 分離されたコンパイル

## ランタイムエラー

あなたのコードがjsの任意の形式に依存する場合は、実行時にランダムなエラーが発生します。

* **クラスの継承は実行時に破損する可能性があります。**

`foo.ts`を考えてみましょう：

```typescript
class Foo {

}
```

と `bar.ts`：

```typescript
class Bar extends Foo {

}
```

あなたが正しい順序でコンパイルに失敗した場合など。おそらくアルファベット順に`tsc bar.ts foo.ts`コードがコンパイルされますが、実行時に`ReferenceError`でエラーが発生します。

* **モジュールの分割は実行時に失敗することがあります。**

`foo.ts`を考えてみましょう：

```typescript
module App {
    export var foo = 123;
}
```

そして`bar.ts`：

```typescript
module App {
    export var bar = foo + 456;
}
```

あなたが正しい順序でコンパイルに失敗した場合など。おそらくアルファベット順に `tsc bar.ts foo.ts`コードがコンパイルされますが、実行時には`bar`が`NaN`に設定されています。

## 高速コンパイル

`--out`を使用すると、単一の`.ts`ファイルは、不要なハックなしに単独で単一の`.js`ファイルにコード化することはできません。`--out`は本質的に遅いインクリメンタルビルドを強制します。

また、ソースマップは位置的にセンシティブでランレングス符号化されているので、元のマップを使用する場合は再コンパイル時に大部分のマップを再構築する必要があります。10秒から100秒のクロックが必要になるので、それは遅くなるでしょう。

## グローバルスコープ

確かに名前空間を使うことはできますが、ブラウザで実行すると`window`にはまだその名前空間を使うことができます。名前空間は不要な回避策に過ぎません。また、`/// <reference`コメントは、あなたのコードにグローバルコンテキストを導入して、保守性を損ねます。

また、あなたの会社が独立して働いているいくつかのチームを持っていて、誰かが独立に書かれた2つのアプリケーションを統合しようと決心した場合、名前が競合する可能性が高いです。

## 分析しづらさ

私達は、より多くのコード解析ツールを提供したいと考えています。依存関係のチェーン(暗黙的に外部モジュールを使用している銀の大皿があります)を提供すると、これらは簡単になります。

また、\_devツール\_だけでなく、コードを理解するのに苦労します。次の人間は、物が実際にどこからインポートされるのかを理解し始める前に、多くのコードベースを理解する必要があります。内部モジュールを使用すると、コードを分離してレビューすることも難しくなります。例えば、githubで。

## スケールしづらさ

ランダムなランタイムエラー、遅くなるコンパイル時間、他の人のコードを理解するのが難しくなることによる、ただの結果です。

## `_references.ts`

`tsconfig.json`ではサポートされていません： <https://github.com/Microsoft/TypeScript/issues/2472#issuecomment-85330803> あなたは手動で`files`の配列をソートする必要があります。

## コードの再利用

あなたのコードの一部を別のプロジェクトで再利用したい場合、そのすべての\_暗黙の\_依存関係管理を、潜在的なランタイムエラーなしに移植することは難しくなります。

## 複数のターゲット

また、nodejs(例：*testing* API)のようなものでブラウザコードを再利用することに決めた場合は、モジュールシステムに移植するか、nodejsの`global`を、あなたの新しいグローバルスコープにするために醜いハックを考える必要がありますスコープ(例:`window`)。

## 分離されたコンパイル

ファイルを単独でコンパイルすることはできません。例えば「a.ts」を考えてみましょう：

```typescript
module M {
  var s = t;
}
```

次の形式の`b.ts`があるかどうかによって出力が異なります：

```typescript
module M {
  export var t = 5;
}
```

または

```typescript
var t = 5;
```

そのため`a.ts`は [分離コンパイルできません](https://github.com/Microsoft/TypeScript/issues/2715)

## まとめ

`--out`はビルドツールの仕事です。また、このようなビルドツールを使っても、外部モジュールによって提供される依存関係の恩恵を受けることができます。そのため、外部モジュールを使用し、必要に応じてビルドツールで単一の`.js`ファイルを作成することをお勧めします。

<https://twitter.com/nycdotnet/status/613705850574778368>

![The Bas Signal](https://pbs.twimg.com/media/CIRSOBmWsAQdzvP.jpg)
