2017-01-30 25 views
0

のプロパティ「LONG_NAME」を読み取ることができない私は自分のコードの下TypeScript official documentation.に示すようNon-null assertion operatorを使用しようとしました:活字体:ヌル

let streetNumberComponent = this.getAddressComponent(addressComponents, 'street_number'); 
    address.streetNumber = streetNumberComponent!.long_name(); 

    ... 

    public getAddressComponent(addressComponents: Array<any>, type: string): any { 

     addressComponents.filter(component => { 
      let types : Array<string> = component.types; 
      if(_.includes(types, type)) { 
       return component; 
      } 
     }); 

     return null; 
    } 

私はプロパティlong_name()streetNumberComponentnullない場合にのみアクセスされることを期待しました。しかし、それはそうではないですし、私が取得:次のコードは正常に動作することを

TypeError: Cannot read property 'long_name' of null 

注:

address.streetNumber = streetNumberComponent && streetNumberComponent.long_name(); 

を私が使用している:

  • 活字体:2.0。 10
  • 角度:2.3.1
  • 角度CLI:1.0.0-beta.24
+0

streetNumberComponent!.long_name(); 'あなたの質問を書くときに感嘆符が誤植ですか? –

+0

これは、TypeScriptの「非nullアサーション演算子」です。 –

+0

ああ、私の悪い、TS haha​​であまりそれをしていない。 –

答えて

2

非ヌルアサーションオペレータのみtypescriptですで使用され、それがコンパイル処理に耐えられないし、存在しないんjsコード内にあります。ドキュメントに記載されているとおり:

! null以外のアサーション演算子は単に

この演算子は、実際にそれがnullではない前に、何のことをチェックしません発せられる JavaScriptコードで削除され、それはあなたがしているコンパイラに指示するためだけの方法ですたとえコンパイラがそれ自体を推論できなくても、nullでないことを確かめてください。

このコードを実行すると明らかにstreetNumberComponentはnullです。

+0

ありがとうございました。そのような演算子の本当の有用性は何ですか?私はそれの具体的な使用法を見ることができません! –

+0

あなたの質問のリンクにある例は、そのようなシナリオを示しています。あなたは時々コンパイラ以上を知っているので、言語はコンパイラを修正するさまざまな方法を導入しました。その1つはこの演算子であり、もう1つはキャスト/タイプアサーションです。 –

+0

ありがとう! –