2017-01-02 8 views
1

は私vscodeに以下のエラーを取得しています:活字体プロパティが見つからないエラー:

[ts] Property 'getPatientAllAddress' does not exist on type 'Object'. 

なぜそれがgetPatientAllAddress()動的に追加取得される方法をチェックしていますか? これは通常Javascriptで発生しません。

get addresses() { 
    if (this.data && this.data.hasOwnProperty("getPatientAllAddress")) { 
     return this.data.getPatientAllAddress(); 
    } 
} 

この警告を抑止/無視する方法。

+0

私が知っている限り、あなたは 'data'を宣言しているインターフェイスかインラインを通してthis.dataの"データ型 "を宣言しなければなりません。どのタイプスクリプトでは、 'data'を通常のObjectとして宣言しているということですが、プロパティ" getPatientAllAddress "が効果的に存在し、関数であるかどうかは分かりません。インターフェイスを実装する必要があることをアサートするあなたは "this.data"と入力するとインテリセンスを持っています。インラインでやりたいのなら、 'private data:{getPatientAllAddress:()};'はうまくいくはずです。 – briosheje

答えて

3

までthis.dataObjectでした。このエラーは、タイプObjectの変数.getPatientAllAddress()にアクセスしようとしているために発生します。論理的にそのプロパティを持つべきであることを論理的に確認しても、コンパイラはそのプロパティをその変数のインターフェイスで利用可能にする必要があることを理解するにはまだスマートではありません。

ソリューション1

あなたはnoImplicitAnyフラグがあなたをオンにしていない場合

return data['getPatientAllAddress'](); 

ソリューション2

に最後の行を変更して逃げることができるはずです

this.dataのタイプを:{getPatientAllAddress?:Function}に設定してください(またはより良い世界ではthis.dataに対応するインターフェイスを作成します。その機能を除く)。ファンクションまたは適切なより具体的なタイプのいずれかを使用してください。

溶液3

フルデータ

interface Bleh { 
    getPatientAllAddress : Function 
} 

と型ガード

function isBleh(x:any) : x is Bleh { 
    return x && x.hasOwnProperty("getPatientAllAddress"); 
} 

ためのインターフェースを定義し、

if (isBleh(this.data)) { 
    this.data.getPatientAllAddress(); 
} 
として使用3210

解決方法1が最も簡単ですが、解決策2が最も正確です(ただし、このオプション機能だけでなく、そのインターフェイスでもすべてを定義する必要があります)。解決策3では、 1と2が実行可能でない状況で、あなたがしなければならないことについて話しています。

+1

インテリセンスの完了については、ソリューション2をお勧めします。そうすれば、インテリセンスはあなたに少し役立ちます:)。 – briosheje

+1

'getPatientAllAddress:Function' - 私は'(...args:any [])=> any''型はこの状況では良いでしょう。そして、正しいパラメータリストと戻り値の型にさらに引き締められます。私は任意の関数オブジェクトが(例えばクラスを引数として期待しているときなどに)使われているときにのみ 'Function'を使っていますが、呼び出し可能なインターフェースメソッドではないのです。 –

+1

@JohnWeisz私は同意しますが、私はどちらが新しい人にとってより明確であるか分かりません。 – Paarth