TS(2322) 在 Angular 12 中使用 Observable 时出错

TS(2322) Error When Using Observable In Angular 12

我是 Angular 12 框架的新手。我正在学习使用 Observable class 异步查询固定数据的教程;由于在训练中使用 Angular 8 导致的版本差异,我收到 ts(2322) 错误。下面提供了服务、模块和数据源的摘要:

/* movie.service.ts */
export class MovieService
{  
    ...
    getMovie( id: number ) : Observable<Movie>
    {
        /* TS(2322) error occurs in the following line of code. */
        return of( Movies.find( movie => movie.id === id ) );
    }
}

/* movie.datasource.ts */
import { Movie } from "./movie";

export const Movies: Movie[] = [
    { id: 1, name: "movie1", imageUrl: "1.jpg" },
    { id: 2, name: "movie2", imageUrl: "2.jpg" }
];

/* movie.ts */
export class Movie 
{
    id!: number;
    name!: string;
    imageUrl!: string;
}

文件 movie.service.ts 中的 getMovie() 方法输出以下错误:

Type 'Observable<Movie | undefined>' is not assignable to type 'Observable<Movie>'.
  Type 'Movie | undefined' is not assignable to type 'Movie'.
    Type 'undefined' is not assignable to type 'Movie'.ts(2322)

我知道这个问题是由 TypeScript 的类型安全规则引起的。我该如何解决这个问题?

预先感谢您的帮助。

好吧,这个错误是可以自我描述的。如果找到,Movies.find() 可以 return 电影,否则 undefined。最简单的适应方式就是期望:

getMovie( id: number ) : Observable<Movie | undefined>
{
    return of( Movies.find( movie => movie.id === id ) );
}

或者,您可以检查 find() 的结果,如果结果为空 - return 一个 new Movie() 或抛出异常