2017-10-22 17 views
1

基本的には、すべての呼び出しでHttpの代わりにHttpClientを使用しようとしています。そのため、応答の一部のプロパティにアクセスできるインターフェイスを作成しました。事は、私はこのコードの先行入力を持っているということですが:typescriptでマップ演算子の型を使用するにはどうすればよいですか?

const URL = 'https://maps.google.com/maps/api/geocode/json'; 
this.searchField = new FormControl(); 
this.results$ = this.searchField.valueChanges 
    .debounceTime(500) 
    .switchMap(query => this.http.get(`${URL}?address=${query}`)) 
    .map(response => response) 
    .map(response => response.results); 

私はこのように、最後の2行にresponseにAPIResponseと呼ばれる私のインターフェイスを割り当てようとしました:.map(response:APIResponse => ...)が、それは明らかに構文エラーがスローされます。

回答のタイプはどこに含める必要がありますか?または、私のコードをどうやって変更できますか?

ありがとうございます。あなたはタイプを追加する場合

+0

'this.http.get (...) 'ならば、' .json() 'マッピングを取り除くことができます。 [the docs](https://angular.io/guide/http)を読んでいませんか? – jonrsharpe

+0

あなたのタグはあなたが 'HttpClient'を使っていると言いますが、' Http'を使うときは 'json()'メソッドが利用できます。あなたはどちらを使っていますか?つまり、 'this.http'の型は何ですか? – meriton

答えて

2

あなたは()を使用する必要があります。個人的に

.map((response:APIResponse) => ...) 
+0

これは危険な習慣であり、避けるべきです。その理由は、apiが 'Observable 'と入力された場合、このフォームは、特に連鎖されたオペレータコールを使用すると、いつでも破損する可能性のある誤ったタイプの錯覚を与えます。逆に、APIに適切なパラメータタイプがある場合、APIを明示的に指定することは、やはり誤ったコードにつながるため、貧しい方法です。 –

4

、私がしたい:

.map(response => response.json() as ApiResponse) 
.map(response => response.results); 

ところで、あなたがいた場合は4.3角度で導入された新しいHttpClientを使用します手動でJSONに変換する必要はありません。

this.httpClient.get<ApiResponse>(`${URL}?address=${query}` 
    .map(response => response.results); 
関連する問題