2017-09-01 1 views
2

Je reçois l'erreur suivante.Impossible d'affecter l'objet de type Réponse à la variable de type Réponse

L'argument de type 'Response' n'est pas assignable au paramètre de type 'Response'.
La propriété 'body' est manquante dans le type 'Response'.

Le code que je cours repose sur des observables.

public register(reporter: Reporter): Observable<Response> { 

    const content = JSON.stringify(reporter); 
    const headers = new Headers({ "Content-Type": "application/json" }); 
    const options = new RequestOptions({ headers: headers }); 
    const userUrl = env.Url + "user"; 
    const passwordUrl = env.Url + "PasswordClaim/" + reporter.Id; 

    const observable = new Observable<Response>(_ => { 
    this.http 
     .post(userUrl, content, options) 
     .subscribe(result => this.http 
      .get(passwordUrl) 
      .subscribe(result => _.next(result), error => _.error(error)), 
     error => _.error(error)); 
    }); 

    return observable; 
} 

Avant, nous avons utilisé faiblement typé observable, qui fonctionne mais pas aussi bon et propre que je souhaite. Alors, je planait sur résultat et obtenu que c'est de type Réponse. En utilisant cela, cependant, semble produire ce message d'erreur étrange.

Je peux imaginer que ses classes différentes nommées de la même façon et placés dans des espaces de noms séparés. Cependant, googling ne m'a donné aucune confirmation de cela, encore moins une solution suggérée sur la façon de le résoudre. Il y a suggestions pour omettre la saisie tous ensemble mais cela ne fait pas partie de la question.

Répondre

1

Ce que vous faites ici renvoie un Observable d'un Observable. Votre méthode doit être tapé le long des lignes de

public register(reporter: Reporter): Observable<Reporter> {} 

Ou

public register(reporter: Reporter): Observable<any> {} 

Peut-être que vous pourriez essayer et voir le résultat?

EDIT J'ai maintenant une meilleure prise en main de votre problème.

Essayez quelque chose comme ça

public register(reporter: Reporter): Observable<Response> { 

    const content = JSON.stringify(reporter); 
    const headers = new Headers({ "Content-Type": "application/json" }); 
    const options = new RequestOptions({ headers: headers }); 
    const userUrl = env.Url + "user"; 
    const passwordUrl = env.Url + "PasswordClaim/" + reporter.Id; 

    return this.http 
    .post(userUrl, content, options) 
    .flatMap(result => this.http.get(passwordUrl)); 
} 

Fondamentalement, un appel HTTP renverra une réponse. En utilisant l'abonnement, vous gérez réellement la réponse. Ce que vous faites, c'est traiter la réponse, renvoyer une nouvelle réponse personnalisée.

Ce que je fais au contraire, fait deux appels avec flatMap et retourner le résultat du dernier appel.

EDIT 2 Voici la fonction complète:

public register(reporter: Reporter): Observable<Response> { 

    let ret = {}; 

    const content = JSON.stringify(reporter); 
    const headers = new Headers({ "Content-Type": "application/json" }); 
    const options = new RequestOptions({ headers: headers }); 
    const userUrl = env.Url + "user"; 
    const passwordUrl = env.Url + "PasswordClaim/" + reporter.Id; 

    return this.http 
    .post(userUrl, content, options) 
    .flatMap(result => { 
     ret['result1'] = result; 
     return this.http.get(passwordUrl).map(r => ret['result2'] = r); 
    }); 
} 
+0

Qu'il me soit permis une heure ou deux à traiter. Il semble toujours confus que * Réponse * ne peut pas être assenti à * Réponse *. J'ai également réalisé que je ** veux ** retourner * Réponse *, pas * Credentials * parce que je pourrais vouloir lire le texte d'état et le code d'erreur dans le futur. Pourquoi est-ce que "le type X n'est pas assignable au type X" est possible comme un message d'erreur ?! Et +1 pour l'exemple de code. –

+0

En fait, j'ai fait une erreur, mon chemin est en train de retourner une réponse! J'ai supprimé mon commentaire précédent pour éviter toute erreur. – trichetriche

+0

Vous devez taper votre méthode comme 'Observable ', et non Credentials. Ensuite, vous pouvez obtenir les données avec 'response.json()' et le code avec 'response.status'. De cette façon, vous avez tout ce que vous voulez! – trichetriche