我有一个谷歌地图方向服务,我正试图转换成一个可观察的模式。以下是https://developers.google.com/maps/documentation/javascript/examples/directions-simple中的示例:

  function calculateAndDisplayRoute(directionsService, directionsDisplay) {
    directionsService.route({
      origin: document.getElementById('start').value,
      destination: document.getElementById('end').value,
      travelMode: 'DRIVING'
    }, function(response, status) {
      if (status === 'OK') {
        directionsDisplay.setDirections(response);
      } else {
        window.alert('Directions request failed due to ' + status);
      }
    });
  }

我尝试了以下方法:
import { Observable } from 'rxjs/Observable';
...
  // the callback version works
  getRoute (route: any) {
    const defaults = { 'travelMode': 'WALKING' };
    route = Object.assign(defaults, route);
    this._directionsService.route(
      route
      , (res:any, status:string) => {
          if (status == 'OK')
            this.displayRoute(res);
          else
            this.handleError(res)
       })
  }

  // the Observable version doesn't get past typescript
  getRoute$ (route: any) {
    const defaults = { 'travelMode': 'WALKING' };
    route = Object.assign(defaults, route);
    let route$ = Observable.bindCallback(
      this._directionsService.route
      , (res, status)=>{res, status}
    );
    // TS says, "Supplied parameters do not match any signature of call target
    route$( route ).subscribe(
      (resp:any)=>{
        // also, how do I throw an error from the selector func?
        if (resp.status == 'OK')
          this.displayRoute(resp.res);
        else
          this.handleError(resp.res)
      }
    )
  }

为什么typescript拒绝这个模式?

最佳答案

我只是在尝试使用bindcallback时处理了相同的错误。我通过显式地指定指向bindcallback结果的var的类型来解决这个问题。我刚用了“任意”。在你的情况下,试试

let route$ : any = Observable.bindCallback(...)

但这并不能解释为什么typescript拒绝它。我想这是因为bindcallback结果的类型定义是参数化的(即,它们是泛型的)。看看boundCallbackObservable.d.ts看看我的意思。注意所有重载的“create”方法的多个参数化定义(其中一个最终被调用)。

10-04 15:25