Angular Subcribe-类型“ Subscription”缺少类型“ ToDo []”的以下属性:length,pop,push,concat和另外26个属性

时间:2019-08-23 08:49:12

标签: angular http https subscribe

代码返回错误类型'Subscription',但类型'ToDo []'中缺少以下属性:length,pop,push,concat和另外26个。

这通常是由于未将return observable设置为数组引起的。就我而言,返回类型是一个数组,但是此错误不断破坏我的应用程序。尽管以前工作过。

toDoList: ToDo[];   
this.usertodo = this.getUserTodo(this._userId);

getUserTodo(id: number): ToDo[] {
    return this.DataService.apiGetUserTodo(id).subscribe(
        todo => {
            this.toDoList = todo;
        }
    );
}

//数据服务

apiGetUserTodo(id: number): Observable<ToDo[]> {
    const url = `${this.APIurl}/users/${id}/todos`;
    return this.http.get<ToDo[]>(url).pipe(
      tap(data => console.log('USER ' + JSON.stringify(data)))
    );
}

这应该没有错误,但是会出现此消息

  src / app / todo / todo.component.ts:28:8中的

ERROR-错误TS2740:类型'Subscription'缺少类型'ToDo []'中的以下属性:长度,弹出,推入,连续和还有26个。

4 个答案:

答案 0 :(得分:1)

那是因为您的方法getUserTodo()返回的是Subscription而不是ToDo[]。 我认为您根本不需要usertodo。例如,您可以在getUserTodo()中调用ngOnInit(),其余的都可以。致电toDoList时,getUserTodo()将被填充。

或者您可以将getUserTodo()的返回类型更改为Subscription

答案 1 :(得分:0)

由于某些原因-尽管存在错误,代码仍能按预期工作。数组中填充了ToDo对象。

答案 2 :(得分:0)

Please try using below code 

export class ToDo {
    id: number;
    title: string;
    complete: boolean;
}

ngOnInit() {
  this.getUserTodo(1);
}

// please add void return type instead of ToDo[], because you have already subscribe in the below method

getUserTodo(id: number) {
    this.DataService.apiGetUserTodo(id).subscribe(todo => {
      this.toDoList = todo;
      this.usertodo = todo;
   });
}


    apiGetUserTodo(id: number): Observable<ToDo[]> {
        const url = `api/users/${id}/todos`;
        return this.http.get<ToDo[]>(url)
        .pipe(
            tap(data => {
                console.log('USER ' + JSON.stringify(data));
                return data;
            })
        );
    }

答案 3 :(得分:0)

您可以使用任何变量来捕获预订,然后将切片的变量分配给您的类变量。

toDoList: ToDo[];
toDo: any;

this.usertodo = this.getUserTodo(this._userId);

getUserTodo(id: number): ToDo[] {
    return this.DataService.apiGetUserTodo(id).subscribe(
        todo => {
            this.toDo = todo;
            this.toDoList = this.toDo.slice();
        }
    );
}