2016-10-26 10 views
2

К предисловию: Я знаю, что есть тонна других вопросов с такой же ошибкой, но я все еще не могу понять свою собственную.Тип 'Observable <{}> не может быть присвоен типу' Observable '

У меня есть простой сервис и еще один простой компонент. Я стараюсь очень внимательно следить за angular2 героя учебник, вот мой код:

location.ts


export class Location { 
    name: string; 
    type: string; 
    c: string; 
    zmw: string; 
    tz: string; 
    tzs: string; 
    l: string; 
    ll: string; 
    lat: string; 
    lon: string; 
} 

местоположения search.service.ts


import { Injectable }  from '@angular/core'; 
import { Http, Response } from '@angular/http'; 
import { Observable }  from 'rxjs'; 

import { Location }   from './location'; 

@Injectable() 
export class LocationSearchService { 
    constructor(private http: Http) {} 

    search(term: string): Observable<Location[]> { 
     return this.http 
      .get(`api_url_i've_removed`) 
      .map((r: Response) => r.json().data as Location[]); 
    } 
} 

расположение-search.component.ts


import { Component, OnInit } from '@angular/core'; 
import { Router }    from '@angular/router'; 
import { Observable }   from 'rxjs/Observable'; 
import { Subject }    from 'rxjs/Subject'; 

import { LocationSearchService } from './location-search.service'; 
import { Location }     from './location'; 

@Component({ 
    selector: 'location-search', 
    templateUrl: 'location-search.component.html', 
    styleUrls: ['assets/styles.css'], 
    providers: [ LocationSearchService ] 
}) 

export class LocationSearchComponent implements OnInit { 
    locations: Observable<Location[]>; 
    private searchTerms = new Subject<string>(); 

    constructor(
     private locationSearchService: LocationSearchService, 
     private router: Router) {} 

    search(term: string): void { 
     this.searchTerms.next(term); 
    } 

    ngOnInit(): void { 
     this.locations = this.searchTerms // <- ERROR HERE 
      .debounceTime(300) 
      .distinctUntilChanged() 
      .switchMap(term => term 
       ? this.locationSearchService.search(term) 
       : Observable.of<Location[]>([])) 
      .catch(error => { 
       console.log(error); 
       return Observable.of<Location[]>([]); 
      }) 
    } 
} 

я получаю ошибку: Type 'Observable<{}>' is not assignable to type 'Observable<Location[]>'.at line 29 col 9

я делаю что-то явно не так? Спасибо за любую помощь.

ответ

1

Я не могу сказать вам точной проблемы, но я тоже много раз боролся за это несколько раз!

Это проблема с .switchMap(). ИДК если это проблема машинопись или что .. Может просто файл типизации плохо ..

Вы должны бросить его:

ngOnInit(): void { 
    this.locations = <Observable<Location[]>>this.searchTerms // <- ERROR HERE 
     .debounceTime(300) 
     .distinctUntilChanged() 
     .switchMap(term => term 
      ? this.locationSearchService.search(term) 
      : Observable.of<Location[]>([])) 
     .catch(error => { 
      console.log(error); 
      return Observable.of<Location[]>([]); 
     }) 
} 

Или (как вы упомянули) использовать ваши функции switchMap() и catch() с декларация типа, например:

ngOnInit(): void { 
    this.locations = this.searchTerms // <- ERROR HERE 
     .debounceTime(300) 
     .distinctUntilChanged() 
     .switchMap<Observable<Location[]>>(term => term 
      ? this.locationSearchService.search(term) 
      : Observable.of<Location[]>([])) 
     .catch<Observable<Location[]>>(error => { 
      console.log(error); 
      return Observable.of<Location[]>([]); 
     }) 
} 
+0

Спасибо! Я также исправил эту проблему, выполнив '.switchmap > .' и' .catch > ' –

+0

А, отлично. Не знал этого - спасибо! Также обновит мой ответ. – mxii

+0

Thx, ваше первое решение сделало это для меня. – SoS