TypeScriptコンパイラエラーにもかかわらず、React Nativeアプリが正常にビルドされるのはなぜですか?


15

私は最近ExpoでTypeScriptを使い始めました。リンター/フォーマッターの統合をすべて行ったtypescript-eslintので、コーディング中にほとんどのエラーをキャッチできます。コードがコンパイルされるかどうかを確認するために、時々実行npx tscして修正します。

まだ十分に理解していないことの1つは、コンパイルエラーが多数ある場合でもアプリが正常にビルドされる理由です。アプリが正常にビルドされるのではなく、すべてのコンパイルエラーに対して赤い画面エラーが表示されることを期待(および好む)し、後で見つけます。例えば、

function square<T>(x: T): T {
  console.log(x.length); // error TS2339: Property 'length' does not exist on type 'T'.
  return x * x;
}

コンパイル時に簡単に確認できる典型的なTypeScriptエラーです(私はそう思いますか?)。大きな赤い画面エラーが発生し、ビルドが失敗するようにしたい。

私はTypeScriptを初めて使用するので、非常に重要なものが見当たらない可能性があります。この寛大さを正確に引き起こしているものは何ですか?より厳密なチェックを強制する方法はありますか?


「正常にビルド」とは、JSが出力されることを意味しますか、それとも、ある時点でコンパイラエラーメッセージが表示されないのですか?
ecraig12345

2
とにかくJSが出力され、アプリを開発モードで実行でき、問題なく本番アプリをビルドすることもできます。TypeScriptがコンパイル時にこれを防ぐことを期待していました。実行すると常にコンパイラエラーメッセージが表示されますがnpx tsc、通常のJSエラーの場合と同じようにconst n = 23; n.reverse();、すべてのTypeScriptエラーに対して赤い画面が表示されるようにしたいのですが、 「n.reverse is not a function。 'n.reverse()'、 'n.reverse' is undefined) "
anar

2
これも奇妙だと思います。それに対する適切な解決策も見つかりません。
Simon Bengtsson

回答:


2

最初に理解する必要があるのは、TypescriptはJavascriptのスーパーセットであり、この場合、コンパイル時に実際に型チェックが行われないことです。

基本的に何が起こるかは、BabelはTypescriptを取り除いてそれをJavascriptに変換するだけであり、それがjsバンドルにコンパイルされます。

次のBabelドキュメントの最初の行と注意事項を確認できます。https//babeljs.io/docs/en/next/babel-plugin-transform-typescript

Babelは型チェックを行わないため、構文的には正しいが、TypeScriptの型チェックに失敗するコードは、正常に変換されない場合があり、多くの場合、予期しないまたは無効な方法で変換されます。

tsconfigでtrueに設定してtsc、最初にインクルードするか、またはnoEmitTypescript コンパイルにビルドコマンドを拡張することをお勧めします。

更新:プロジェクトを追加jesttypescriptたり、プロジェクトに追加したりしたときに、これが最近適用される別のインスタンスを見つけました。Jestのドキュメントの最後に、彼らは実際に同じことを述べています:

https://jestjs.io/docs/en/getting-started#using-typescript

ただし、BabelでTypeScriptを使用する場合、いくつかの注意点があります。BabelでのTypeScriptのサポートはトランスパイレーションであるため、Jestは実行時にテストの型チェックを行いません。それが必要な場合は、ts-jestを使用できます。

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