Тип «Observable <any>» не может быть назначен типу «Observable <any>» Ioni c 4 - PullRequest
0 голосов
/ 12 февраля 2020

Я сейчас работаю с Google API с Ioni c 4, я пытаюсь реализовать метод, который принимает адрес в записи и возвращает широту и долготу этого адреса (геокодирование). Когда я пытался реализовать этот метод, у меня была такая проблема:

Тип 'Observable' нельзя назначить типу 'Observable':

Код функции:

geocodeAddress(location: string): Observable<Location> {
  return this.waitForMapsToLoad().pipe(
  switchMap(() => {
    return new Observable(Location => {
      this.geocoder.geocode({address: location}, (results, status) => {
        if (status === google.maps.GeocoderStatus.OK) {
          observer.next({
            lat: results[0].geometry.location.lat(),
            lng: results[0].geometry.location.lng()
          });
        } else {
          console.log('Error - ', results, ' & Status - ', status);
          observer.next({ lat: 0, lng: 0 });
        }
        observer.complete();
      });
    });
  })
);
}`

Класс местоположения:

export interface Location {
  lat: number;
  lng: number;
} 

Импорт:

import { Injectable } from '@angular/core';
import { MapsAPILoader } from '@agm/core';
import { Observable } from 'rxjs';
import { Subject } from 'rxjs/Subject';
import { of } from 'rxjs/observable/of';
import { filter, catchError, tap, map, switchMap } from 'rxjs/operators';
import { fromPromise } from 'rxjs/observable/fromPromise';
import { Location } from './Position';

Произошла ошибка:

TS2322: Type 'Observable<unknown>' is not assignable to type 
'Observable<Location>'.   
Type '{}' is missing the following properties from 
type 'Location': lat, lng

Я видел людей, имеющих такую ​​проблему, но не ту же, мог пожалуйста, помогите мне?

1 Ответ

0 голосов
/ 14 февраля 2020

Скорее всего, вам не хватает какого-то типа для какого-то значения, и компилятор не может определить тип вашей наблюдаемой.

Укажите это явно, используя new Observable<Location>, что должно указать вам еще одну ошибку несоответствия типов или приведите свою наблюдаемую с помощью

return new Observable(Location => {
  this.geocoder.geocode({address: location}, (results, status) => {
    if (status === google.maps.GeocoderStatus.OK) {
      observer.next({
        lat: results[0].geometry.location.lat(),
        lng: results[0].geometry.location.lng()
      });
    } else {
      console.log('Error - ', results, ' & Status - ', status);
      observer.next({ lat: 0, lng: 0 });
    }
    observer.complete();
  });
}) as Observable<Location>;

Используя явные типизации, вы можете сузить задачу постановки линий и применить свое приведение только к этой линии.

правка: копирование / вставка ваш код, я заметил, что вы используете Location в качестве лямбда-переменной, я предполагаю, что вы допустили ошибку при публикации, и что она правильно установлена ​​в observer в вашем коде.

...