返回promise并从中创建observable时,Typescript Angular2错误

gha*_*han 3 typescript ionic-framework ionic2 angular

我试图从ionics storage中检索一个令牌,getToken()然后使用它refreshToken()来查看令牌是否已过期,方法是将令牌传递给它,(this.jwtHelper.isTokenExpired(this.token)这将返回true或false,具体取决于令牌是否已过期.我已将评论放在refreshToken()我收到以下错误的位置

错误1:

Error: TS2345:Argument of type '(response: Response) => void' is not assignable to parameter of type '(value: Response) => void'. Types of parameters 'response' and 'value' are incompatible. Type 'Response' is not assignable to type 'Response'. Two different types with this name exist, but they are unrelated. Property 'body' is missing in type 'Response'.

错误2:

Error:(34, 46) TS2339:Property 'token' does not exist on type 'Promise<any>'.

我的代码

import {AuthHttp, JwtHelper, tokenNotExpired} from "angular2-jwt";
import {Observable} from "rxjs/Observable";
import {AuthService} from "../Services/Auth/auth.service";
import {Injectable} from "@angular/core";
import { Storage } from '@ionic/storage';
import {AlertController} from "ionic-angular";

@Injectable()
export class TokenProvider {

jwtHelper: JwtHelper = new JwtHelper();
token;

constructor(private authHttp: AuthHttp, private storage: Storage, private alertCtrl: AlertController) {
}

getToken(): Promise<any> {
  return this.storage.get('token').then(token => {
     this.token = token;
  });
}

refreshToken(): Observable<any> {

  return this.token = Observable.fromPromise(this.getToken())
    .flatMap(() => {
      if(this.jwtHelper.isTokenExpired(this.token))
      {
        return this.authHttp.get('localhost.api/refresh')
          .subscribe(   // ERROR 1 HERE
            (response: Response) => {
              this.token = response.json().token;  // ERROR 2 HERE
            },
            (error: Response) => {
              console.log(error);
            });
      }
    });
}
Run Code Online (Sandbox Code Playgroud)

Sar*_*ana 8

您没有导入Response代码.编译器可能会混淆使用哪个Response,因为您的打字中可能有多个定义:

import { Response } from '@angular/http';
Run Code Online (Sandbox Code Playgroud)

此外,你没有返回内部的观察flatMap.你要回来了Subscription.像这样返回原始的observable:

refreshToken(): Observable <any> {

    let observable = Observable.fromPromise(this.getToken())
     .filter(() => this.jwtHelper.isTokenExpired(this.token))
     .flatMap(() =>  this.authHttp.get('localhost.api/refresh'));
    observable.subscribe((response: Response) => {
            this.token = response.json().token;
        }, (error: Response) => {
            console.log(error);
        });
    return observable;
}
Run Code Online (Sandbox Code Playgroud)