2017-04-06 8 views
2

私は、value.lengthは常に.map演算子に到達するまでに定義されると考えています。しかし、typesCriptでstrictNullChecksを使用すると、 "Object is undefined"というエラーがスローされます。間違っているのですか、これは既知の問題ですか?Typescripts厳密なnullチェックと観測可能なフィルタ

this.count$ = this.store.select<Model>('state') 
      .filter(value => !!value && !!value.prop) 
      .map(value => value.prop) 

答えて

1

NGRXレデューサーに何らかの初期値を指定した場合にのみ定義されます。もしあなたがそれをしていなければ、未定義になる可能性があります。

あなたは配列を扱っている場合は、[]にあなたの初期値を設定したい:あなたはどこかに何かを定義していない場合

const initialState = []; 

export function myReducer(state = initialState, action: Action) 
.... 

活字体コンパイラが正しいかは、あなたが潜在的に未定義の値を持つことができます。

EDIT

は、私はあなたがコンパイラが正確にnull値を検出していないことに、右だと思います。私はstrictNullChecksをオンにし、次のことを行うと、それが正常に動作します:私はfilterを削除する場合は実際には、それはまだ、エラーなしでコンパイル

arr: Person[] = []; 

ngOnInit() { 
    this.arr 
    .filter(x => !!x && !!x.firstName) 
    .map(x => console.log(x.firstName)); 
} 

。私はthis.arr.push(<Person>{lastName: 'test'});を追加しても、オブジェクトにfirstNameを決して定義していないにもかかわらずエラーなしでコンパイルされるため、未定義になります。

私はarrの署名を削除した場合、私はx.firstNameが定義されていないというコンパイルエラーを取得:

arr = []; 

    ngOnInit() { 
    this.arr 
     .filter(x => !!x && !!x.firstName) 
     .map(x => console.log(x.firstName)); 
    } 

strictNullChecksチェックしてだから、活字体コンパイラフィールドは、オブジェクトのインターフェイス上に存在し、必ずしも必要ではないが、彼らかどうかが定義される。

+0

返信いただきありがとうございます!しかし、確かにそれは、フィルタ –

+0

のためにエラーが報告されているところでは、 'map(value => value.prop)'には決して行きません。また、ngrxストアで文字列セレクタを使用していることによっても影響を受ける可能性があります。代わりに、 'this.store.select(s => s.state)'を使用してインターフェイスのハードコーディングを試してください。この方法では、コンパイラは ''のキャストではなく、ストアのデータ型を正しく推測します。 –

+0

残念ながら... –

関連する問題