【问题标题】:Type 'Observable<any>' is not assignable to type 'Observable<any>' Ionic 4类型 'Observable<any>' 不可分配给类型 'Observable<any>' Ionic 4
【发布时间】:2020-05-28 03:03:29
【问题描述】:

我目前正在使用带有 Ionic 4 的 Google API,我正在尝试实现一种方法,该方法在条目中获取地址并返回该地址的纬度和经度(地理编码)。 在尝试实现该方法时,我遇到了这个问题:

类型“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

我看到有人遇到这种问题但不是同一个问题,你能帮帮我吗?

【问题讨论】:

  • 把你的代码放在问题中而不是图片中
  • 也发布您的导入。
  • 如果将代码更改为return new Observable&lt;Location&gt;( 会发生什么?这应该可以帮助 TS 推断出正确的类型,或者至少会显示更详细的错误消息。
  • 我按照你们的要求更改了我的帖子,你能帮帮我吗?
  • @bryan60 做到了。

标签: angular api observable ionic4


【解决方案1】:

很可能您缺少某些值的某些类型,编译器无法确定您的 observable 的类型。

使用new Observable&lt;Location&gt; 明确提及它,这应该会进一步指出另一个类型不匹配错误,或者使用

投射你的 observable
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 作为您的 lambda 变量,我认为这是您在发布时犯的错误,并且在您的代码中正确设置为 observer

【讨论】:

    猜你喜欢
    • 2018-08-14
    • 2017-08-12
    • 2018-08-30
    • 2023-04-10
    • 2018-03-09
    • 2018-04-19
    • 1970-01-01
    • 2021-09-23
    • 2019-04-22
    相关资源
    最近更新 更多