类型Observable <response>不能分配给Observable <list <todo>&gt;类型。

时间:2016-10-28 22:45:17

标签: angular typescript system.reactive rxjs

我正在尝试在this application之后松散地构建一个应用程序,但是我收到了一个TypeScript错误,我想要解释什么是错误的。据我所知,我正在做我应该做的事。

这是我到目前为止编写的代码:

import {Injectable,Inject} from '@angular/core';
import {Http,Headers,URLSearchParams, Response} from '@angular/http';
import {List, Record} from 'immutable';
import {Observable} from "rxjs/Observable";


const TodoRecord = Record({
    id: 0,
    description: "",
    completed: false
});

export class Todo extends TodoRecord {

    id:number;
    description:string;
    completed: boolean;

    constructor(props: any) {
        super(props);
    }

}

@Injectable()

export class TodoBackendService {
    constructor(private http: Http){
        this.http = http;
    }

    getAllTodos(){
        return this.http.get("/todo");
    }

    saveTodo(newTodo: Todo): Observable<List<Todo>> {
        var headers = new Headers();
        headers.append("Content-Type", "application/json; chartset=utf-8");

        return this.http.post("/todo", JSON.stringify(newTodo.toJS()),{headers}).share();
    }
}

这是Visual Studio Code识别为错误的代码行:

 return this.http.post("/todo", JSON.stringify(newTodo.toJS()),{headers}).share();

这是我在VS Code中收到的错误消息:

enter image description here

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

这是如何使用地图。假设response.json()返回一组ToDo模型。

saveTodo(newTodo: Todo): Observable<List<Todo>> {
    var headers = new Headers();
    headers.append("Content-Type", "application/json; chartset=utf-8");

    return this.http.post("/todo", JSON.stringify(newTodo.toJS()),{headers})
        .map((response: Response) => (<ToDo[]>response.json())).share();
}

答案 1 :(得分:4)

信息说明了一切。 http帖子会返回Observable<Response>,而不是Observable<List<Todo>>

您需要使用map()从返回的响应中创建List<Todo>

答案 2 :(得分:0)

试试这个..

saveTodo(newTodo: Todo) : Observable<any> {
        var headers = new Headers();
        headers.append('Content-Type', 'application/json; charset=utf-8');
        return this.http.post('/todo',JSON.stringify(newTodo.toJS()),{headers}).share();
    }