--isolatedModulesエラーがインポートによって修正されるのはなぜですか?


139

create-react-app typescriptプロジェクトでは、いくつかのものをすばやくテストするために、これを書き込もうとしました。

// experiment.test.ts
it('experiment', () => {
  console.log('test');
});

しかし、それは私に次のエラーを与え、その下に赤い波線がありますit:

'--isolatedModules'フラグが指定されている場合、すべてのファイルはモジュールである必要があります。

ただし、ファイルを次のように変更すると、すべてが明らかに問題ありません(もちろん未使用のインポートを除く)。

// experiment.test.ts
import { Component} from 'react'; // literally anything, don't even have to use it

it('test', () => {
  console.log('test');
});

どうして?ここで何が起きてるの?何をするん--isolatedModules実際に行う/意味ですか?


importまたはを使用している場合export、そのファイルはES6モジュールです。ので、あなたの一番上の例では、問題があるit、インポートする必要があると思いモジュラー型アーキテクチャで、どこにも定義されていないitどこかから
— apokryfos

回答:


266

Typescriptは、インポート/エクスポートのないファイルをレガシースクリプトファイルとして扱います。このようなファイルはモジュールや定義ではないため、グローバル名前空間にマージされています。isolatedModulesそのようなファイルを禁止します。

ファイルにインポートまたはエクスポートを追加すると、ファイルがモジュールになり、エラーが表示されなくなります。

またexport {}、何もインポートせずにファイルをモジュールにする便利な方法です。


ありがとう、とても簡単ですが、最初のテストを作成すると、エラーに戸惑います。
— Juanguiヨルダン

2
@JuanguiJordánとても簡単で間違っています。isolatedModules設定したくない場合は、に設定してくださいfalse。
— WojciechBednarski20年

@WojciechBednarskiに感謝しますが、答えについて少し詳しく説明していただけますか?
— Juanguiヨルダン

2
@JuanguiJordánまあ、それはいくつかのルールを追加し、次に追加してそれを無視するようなもの@ts-ignoreです。これexport {}は、ルールをバイパスするための異なる構文ですが、原則としてはまさにそれです。
— WojciechBednarski20年

2
99%の確率で従う一般的なルールに問題はありませんが、それを破る必要がある場合があります。「ルールを破る」必要があるのは、ルールが一般的に良いものである限り、私が何をしているのかを考え、何かを解決するためのより良い方法があるかどうかを考えることを余儀なくされます。そして時々ありません。この場合のように、私は何かを試すためにテストファイルを作成していました。
— Svish 2010

24

正しい方法は、TypeScriptに必要なものを伝えることです。ディレクトリ内にisolatedModules作成しtsconfig.jsonてtest追加したくない場合:

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "isolatedModules": false
  },
}

"isolatedModules": true設定に追加してから、空のexport {}匂いを追加してTypeScriptチェッカーをだますのは悪いコードです。


他のコメントで説明されているように、この特定のケースでは、コードの臭いとしてカウントされません。isolutedModulesルールから一部のファイルを部分的に除外する他の方法がないため、ここで必要です
— Akshay Vijay Jain

私はfalseに真FROBときうーん、私は返事に語っています:TypeError例外:verifyTypeScriptSetupで「#<オブジェクト>」オブジェクトの唯一のプロパティ「isolatedModules」を読み缶は割り当てない
— ジェリー・アッシャー

@JerryAsherはここでも同じですが、以前に機能したので、コードを元に戻して実行しようとしました。これは、まったく同じエラーが発生したときです。
— ガネーシュクマール


1

分離されたモジュールをチェックしてみましょう。私がグーグルをチェックしたとき、それの直接の文脈はありません。

これは基本的に、Typescriptがモジュールを分離してコンパイルできるようにすることを意味します。

しかし、それはTypescriptから来ており、名前空間よりもモジュールを優先するTypescriptと関係があります。

モジュールは、モジュールローダー(CommonJs / Require.jsなど)またはESモジュールをサポートするランタイムにも依存します。モジュールは、コードの再利用、分離の強化、およびバンドルのツールサポートの向上を提供します。

ソース1

create-react-app typescriptプロジェクトを使用して、typescriptとts-jestをインストールしておく必要があります(または、create-react-appは、アプリをイジェクトしたかどうかに基づいて依存関係を処理する必要があります)。

また、ts-jestそれについていくつかの情報を持っています:

デフォルトでは、ts-jestはプロジェクト(あなたの)のコンテキストでTypeScriptコンパイラを使用し、完全な型チェックと機能を備えています。ただし、TypeScriptが「分離モジュール」と呼ぶ各ファイルを個別にコンパイルするためにも使用できます。これが、isolatedModulesオプション(デフォルトはfalse)が行うことです。

ソース2

exportコマンドを使用するとすぐに、エクスポートされているものからモジュールが作成されます。

ts-jestを使用している場合は、create-react-appで構成される他のモジュールに影響を与えることなく、これらの設定を追加できます。

"ts-jest": {
  "isolatedModules": false
}

そして、賛否両論のts-jestページ(セカンドソース)をチェックアウトしてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.