Javascript TS2322:类型';承诺<;英雄|未定义>';不可分配给类型';承诺<;英雄>';

Javascript TS2322:类型';承诺<;英雄|未定义>';不可分配给类型';承诺<;英雄>';,javascript,angular,typescript,Javascript,Angular,Typescript,我在学英语。 以下是从服务功能中获取英雄的功能: @Injectable() export class HeroService { getHeroes(): Promise<Hero[]> { return new Promise(resolve => { // Simulate server latency with 2 second delay setTimeout(() => resolve(

我在学英语。 以下是从服务功能中获取英雄的功能:

@Injectable()
export class HeroService {
    getHeroes(): Promise<Hero[]> {

        return new Promise(resolve => {
            // Simulate server latency with 2 second delay
            setTimeout(() => resolve(HEROES), 2000);
        });
    }

    getHero(id: number): Promise<Hero> {

        if (id < 0) {
            throw new Error('Hero is not found.');
        }
        return this.getHeroes()
            .then(heroes => heroes.find(hero => hero.id === id));
    }
}

typescript引发此错误的原因是
数组。当所有元素不匹配条件时,
查找将返回
未定义的

请参阅关于
数组。查找

find()方法返回数组中满足提供的测试函数的第一个元素的值否则返回未定义。


为了避免错误,您应该将函数的返回类型更改为
Promise

getHero(id:number):承诺{//heros.find(hero=>hero.id==id));
}

你能发布
这个.getHeroes()
方法和
Hero
接口吗。你的代码中应该有Hero类。你应该把它导入你使用的地方。无论将此函数放在何处,请从“Hero.ts”(注意路径)导入{Hero},然后重试。它会引发错误,因为heros.find可能返回未定义的结果。@Shelly您可以发布组件代码或调用
getHero
方法的位置吗。所以它可以帮助我们重现你的错误。@Rajez谢谢你。我补充道,我试过了。TS2322:类型“Hero | undefined”不可分配给类型“Hero”。类型“undefined”不能分配给类型“Hero”。@Shelly它应该可以正常工作。给我一分钟,我会在我的本地网站上确认。@Shelly我复制了你的问题,并确认这种方式将解决你发布的错误。无论如何,如果这不能解决你的问题,我会删除我的答案,以免混淆其他人。你使用的typescript版本是什么???@Shelly目前为2.4.0。
TS2322: Type 'Promise<Hero | undefined>' is not assignable to type 'Promise<Hero>'.
Type 'Hero | undefined' is not assignable to type 'Hero'.
Type 'undefined' is not assignable to type 'Hero'.
@Component({
    selector: 'hero-detail',
    templateUrl: './hero-detail.component.html'
})
export class HeroDetailComponent implements OnInit {
    @Input() hero: Hero;

    constructor(private heroService: HeroService, private route: ActivatedRoute, private location: Location) { }

    ngOnInit(): void {
        this.route.paramMap
            .switchMap((params: ParamMap) => this.heroService.getHero(+(params.get('id') || -1)))
            .subscribe(hero => this.hero = hero);
    }

    goBack(): void {
        this.location.back();
    }
}
getHero(id: number): Promise<Hero | undefined> {    // <----mention here for return type
  return this.getHeroes()
             .then(heroes => heroes.find(hero => hero.id === id));
}