2016-10-20 12 views
3

TypicriptでIonic v2ベータ版を使用しており、--strictNullChecksを使用したいと考えています。しかし、私がtsconfig.jsonstrictNullChecks: trueを入れたときに、@ angular/coreのような私のプロジェクトの依存関係がコンパイルエラーを引き起こします。制限付きスコープのTypescript strictNullChecks

ディレクトリ/ファイル/モジュール/クラスをstrictNullChecksに準拠して宣言する方法はありますか?たとえ全体のプロジェクトをフラグでコンパイルできない場合でもですか?

--strictNullChecksはデフォルトではないため、フラグなしで書かれた依存関係の結果として非常に限定された使用になります(非常に便利な機能ですが)。すべてのタイプのドメインからundefinednull値を除去することにより

答えて

2

あなたの依存関係がすべて.js.d.ts個のファイルにある場合(つまり、このファイルが存在しない場合は、 tsソースではない)、フラグを使用してコンパイラーにlibsの検査をスキップさせることができます。これにより、libsからのエラーは発生しません。

はそのためtwo new flagsあります

skipLibCheck:

デフォルト・ライブラリー(lib.d.ts)ファイルの妥当性をチェックしないでください

skipDefaultLibCheck:

ユーザー定義のデフォルトライブラリ(* .d.ts)ファイルのvalをチェックしないでください。 idity What's new in Typescript 2

そして、それについてもう少し:

活字体2.0は、宣言ファイル(拡張子.d.tsを持つファイル)の 型チェックを起こし、新たな--skipLibCheckコンパイラオプションを追加します をスキップします。プログラムに大きな宣言ファイルが含まれている場合、コンパイラ は、エラーを含まないようにすでに知られている多くの時間型チェック宣言を費やします。コンパイル時間は、宣言ファイル型チェックをスキップして大幅に に短縮されます。

ファイルの宣言は、他の ファイルの型チェックに影響する可能性があるため、--skipLibCheckが である場合、エラーが検出されないことがあります。たとえば、宣言ファイルで宣言された型 が宣言された場合、宣言ファイルがチェックされたときには というエラーのみが返されます。しかし、実際には のような状況はまれです。

+0

ありがとう!私の 'tsconfig'で' 'skipLibCheck":false'を実行するのは私の場合です。しかし、私はまだ--strictNullChecksがデフォルト(すべての人にその定義を適切に適応させる)でなければならないとか、厳密なヌルチェックに従わないタイプスクリプトコードをコードベースに組み込む方法が必要であると主張します。私は複数の 'tsconfig'がオプションかもしれないと思います。 –

+0

独自のtsconfigファイルを使用して、プロジェクトを2つに分割できます。 strictNullChecksを使用するものは '.d.ts'ファイルで他のプロジェクトを使用するため、skipLibCheckを使用すると動作します –

+0

設定が難しく、イオンv2、しかし、それは別の回避策です。 –

1

strictNullChecks作品。これは、タイプのすべての解釈がどのように動作するかを変更するグローバルな設定です。

このフラグがオフの1つのファイルまたはモジュールまたはクラスを持つことが何を意味するのかについての一貫した定義さえありません。物理的な法則がある国では違うのと同様ですそれらの国々の間で商品や人を自由に運ぶことができます。

+0

物理学はまったく異なっていますが、それは問題です。だからこそ、このようなものが必要です。あなたは他人のコードを制御することはできませんが、あなたはそれを操作しなければなりません。 –

+0

これは 'string'は実際には' string | 1つのファイルにはnullがあり、別のファイルにはヌルのない 'string'だけがあります。このオプションは、型チェッカーが、ある可能性のあるすべてのケースで、一方の値が他方の型と互換性のない型を持つ理由を説明するインテリジェントなエラーメッセージを生成する能力を持たない限り、かなり役に立たないでしょう。 – artem

+1

それにかかわらず超不明です。空でないファイルが 'type MyStr = string; 'であり、ヌル可能ファイルが' type MyStr2 = MyStr; ' 'MyStr2'はヌル可能かどうか?理由を考えるのは不可能だろう。 –

2

プロジェクト全体がフラグ

注意してコンパイルすることができない場合でも、strictNullChecksを遵守などのディレクトリ/ファイル/モジュール/クラスを宣言する方法はあります: https://github.com/Microsoft/TypeScript/issues/11051

3

あなたのプロジェクト内の特定のディレクトリにスコープstrictNullChecksしたい場合は、あなたがあなたのtsconfig.jsonextends句でそれを行うことができます。たとえば、あなたのプロジェクトは次のように見える場合:

a/ 
    code.ts 
b/ 
    other.ts 
tsconfig.json 

そして、あなたは、あなたがa/tsconfig.jsonを追加することができa以内に厳密チェックヌルを有効にする:

{ 
    "extends": "../tsconfig.json", 
    "compilerOptions": { 
    "strictNullChecks": true 
    } 
} 

ディレクトリa内部からtscを実行して、あなたa/code.tsの厳密なヌルチェックを受け取ります。

このアプローチには欠点がないわけではない。

  • ../b/other.ts輸入a/code.tsあれば、あなたも、b/other.tsをチェック厳格なヌルを取得します。
  • tscをルートディレクトリから実行すると、a/code.tsの厳密なNULLチェックは行われません。

大規模なプロジェクトでは、効果的に新しい厳しいサブプロジェクトを作成しています。ビルドプロセスの一環として、両方のプロジェクトにtscを必ず実行する必要があります。完璧ではありませんが、大きなプロジェクトをビット単位でstrictNullChecksに移行するのに役立ちます。