【问题标题】:'Observable<Hero[]>' is not assignable to type 'Hero[]''Observable<Hero[]>' 不可分配给类型 'Hero[]'
【发布时间】:2018-10-17 08:10:20
【问题描述】:

我正在关注 Angular 的 Tour of Heroes Tutorial,现在我正在尝试将 observables 集成到我的项目中。将我的 hero.service.ts 文件更改为如下所示后

import { Injectable } from '@angular/core';
import { Hero } from './hero';
import { HEROES } from './mock-heroes';
import { Observable } from 'rxjs/Rx';
import { of } from 'rxjs/observable/of';

@Injectable()
export class HeroService {

  constructor() { }

  getHeroes(): Observable<Hero[]> {
    return of(HEROES);
  }
}

我没有收到以下错误

src/app/heroes/heroes.component.ts(27,5) 中的错误:错误 TS2322:类型 'Observable' 不可分配给类型 'Hero[]'。财产 “可观察”类型中缺少“包含”。

我不确定我在这里做错了什么。我的英雄定义中并没有真正的“包含”属性。那个类是这样的

export class Hero {
    id: number;
    name: string;
}

这是一个link to my project,虽然我无法让它在堆栈闪电战中运行

我会在这里列出完整的代码

heroes.component.ts

import { Component, OnInit } from '@angular/core';
import { Hero } from '../hero';
import { HeroService } from '../hero.service';

@Component({
  selector: 'app-heroes',
  templateUrl: './heroes.component.html',
  styleUrls: ['./heroes.component.css']
})
export class HeroesComponent implements OnInit {

  constructor(private heroService: HeroService) { }

  selectedHero: Hero;

  heroes: Hero[];

  ngOnInit() {
    this.getHeroes();
  }

  onSelect(hero: Hero): void {
    this.selectedHero = hero;
  }

  getHeroes(): void {
    this.heroes = this.heroService.getHeroes();
  }




}

hero.service.ts

import { Injectable } from '@angular/core';
import { Hero } from './hero';
import { HEROES } from './mock-heroes';
import { Observable } from 'rxjs/Rx';
import { of } from 'rxjs/observable/of';

@Injectable()
export class HeroService {

  constructor() { }

  getHeroes(): Observable<Hero[]> {
    return of(HEROES);
  }
}

英雄.ts

export class Hero {
    id: number;
    name: string;
}

mock-heroes.ts

import { Hero } from './hero';

export const HEROES: Hero[] = [
  { id: 11, name: 'Mr. Nice' },
  { id: 12, name: 'Narco' },
  { id: 13, name: 'Bombasto' },
  { id: 14, name: 'Celeritas' },
  { id: 15, name: 'Magneta' },
  { id: 16, name: 'RubberMan' },
  { id: 17, name: 'Dynama' },
  { id: 18, name: 'Dr IQ' },
  { id: 19, name: 'Magma' },
  { id: 20, name: 'Tornado' }
];

【问题讨论】:

  • 您正在尝试将Observable&lt;Hero[]&gt; 分配给Hero[](这正是错误消息所说的)。
  • 为什么这不起作用?我正在关注 Angular 的教程,它适用于他们。我不确定“可观察
  • 您的rxjs 是什么版本?因为从 V6 开始,您必须像这样导入 Observable 对象:import { Observable } from 'rxjs;
  • 你应该阅读教程的以下部分angular.io/tutorial/toh-pt4#subscribe-in-heroescomponent

标签: angular rxjs observable


【解决方案1】:

这就是问题所在:

  getHeroes(): void {
    this.heroes = this.heroService.getHeroes();
  }

正如错误告诉你的那样,this.heroesHero[] 类型(因此,Hero 元素的数组),而 this.heroService.getHeroes(); 返回一个 observable,它是类型Observable&lt;Hero[]&gt;.

由于您使用的是 observable,因此您必须正确订阅它,如下所示:

getHeroes(): void {
   this.heroService.getHeroes().subscribe(result => this.heroes = result);
}

【讨论】:

  • 哦。好的,我现在明白了。我以为我做错了什么,因为它没有编译。谢谢你。当它允许我时,我会接受这个答案。
  • 我觉得没有必要回答这个问题,因为 OP 很可能错过了教程的关键部分,我已经指出并以更好的方式解释了他的问题的解决方案.
  • @Jota.Toledo 但是每个问题都需要答案,评论不能解决所有问题。
  • 我也明白了
  • 我换了英雄:英雄[];对英雄:Observable;改回来,它正在工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 2020-11-23
  • 2019-01-12
  • 2016-09-10
  • 2018-08-14
  • 2021-01-02
  • 2018-03-09
相关资源
最近更新 更多