Angular 订阅 - 类型 'Subscription' 缺少来自类型 'ToDo[]' 的以下属性:length、pop、push、concat 和另外 26 个

Posted

技术标签:

【中文标题】Angular 订阅 - 类型 \'Subscription\' 缺少来自类型 \'ToDo[]\' 的以下属性:length、pop、push、concat 和另外 26 个【英文标题】:Angular Subcribe - Type 'Subscription' is missing the following properties from type 'ToDo[]': length, pop, push, concat, and 26 moreAngular 订阅 - 类型 'Subscription' 缺少来自类型 'ToDo[]' 的以下属性:length、pop、push、concat 和另外 26 个 【发布时间】:2019-12-28 13:41:03 【问题描述】:

代码返回错误 Type 'Subscription' is missing the following properties from type 'ToDo[]': length, pop, push, concat, and 26 more.

这通常是由于返回的 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 中的错误 - 错误 TS2740:“订阅”类型缺少“ToDo[]”类型的以下属性:长度、弹出、推送、连接和还有 26 个。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我明白你在说什么。我将其用作基于用户的过滤器。对我来说,解决办法是清除 toDoList 并用用户特定的 ToDo 对象填充它吗?我一直在将它从内存中的 api 转移到 .net 核心中 我认为您不需要这样做。当你想为另一个用户获取新数据时,你只需调用getUserTodo(id),它就会更新toDoList。如果我正确理解您的问题。 NOT @igor_c,出现错误是因为 Ktall 将“any”类型的变量等同于 Todo[] 类型的变量。你可以避免错误只需写.subscribe((todo:Todo[]) =&gt; this.toDoList = todo; ).subscribe((todo:any[]) =&gt; this.toDoList = todo as Todo[]; ) 我认为这不会发生,因为 Typescript 可以推断出类型。由于apiGetUserTodo() 返回一个ToDo[] 的Observable,订阅中的todo 类型是正确的,而不是任何类型。【参考方案2】:
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;
            )
        );
    

【讨论】:

在这种情况下,您应该从方法中删除 return。但它不起作用,因为您将方法的结果分配给属性usertodo,该方法不返回任何内容 @igor_c 你能帮忙this【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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();
        
    );

【讨论】:

以上是关于Angular 订阅 - 类型 'Subscription' 缺少来自类型 'ToDo[]' 的以下属性:length、pop、push、concat 和另外 26 个的主要内容,如果未能解决你的问题,请参考以下文章

Android 应用内购买订阅并免费试用 - 如何避免滥用?

Angular 2:找不到名称“订阅”

Angular ngOnInit 如何将订阅结果用于另一个订阅/后端调用?

类型“订阅”不可分配给类型“订阅”

我们可以直接在Angular 4组件中订阅RxJs主题吗?

使用 terraform 在 for_each 嵌套资源中循环