Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 如何将`Observable.bindCallback()`与typescript一起使用_Angular_Typescript_Rxjs_Observable - Fatal编程技术网

Angular 如何将`Observable.bindCallback()`与typescript一起使用

Angular 如何将`Observable.bindCallback()`与typescript一起使用,angular,typescript,rxjs,observable,Angular,Typescript,Rxjs,Observable,我有一个谷歌地图方向服务,我正试图转换成一个可观察的模式。以下是来自以下方面的示例: 我尝试了以下方法: import { Observable } from 'rxjs/Observable'; ... // the callback version works getRoute (route: any) { const defaults = { 'travelMode': 'WALKING' }; route = Object.assign(defaults, ro

我有一个谷歌地图方向服务,我正试图转换成一个可观察的模式。以下是来自以下方面的示例:

我尝试了以下方法:

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的类型来解决这个问题。我只是用了“any”。在你的情况下,试试看

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

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

在rxjs 5中,您可以通过实现以下类型签名来解决此问题

static create<T, R>(callbackFunc: (v1: T, callback: (result: R) => any) => any, selector?: void, scheduler?: IScheduler): (v1: T) => Observable<R>;

现在,
route$
的类型是
(v1:routeType)=>可观察的

我想你的意思是:让route$:any=Observable.bindCallback(this.\u directionsService.route,(res,status)=>{res status})不是“可观察的”,对吗?
static create<T, R>(callbackFunc: (v1: T, callback: (result: R) => any) => any, selector?: void, scheduler?: IScheduler): (v1: T) => Observable<R>;
type routeType = String

interface returnType = {
  res: any
  status: any
}

let route$: any = Observable.bindCallback<routeType, observableType>(this._directionsService.route, (res, status)=>{res, status})