代码之家  ›  专栏  ›  技术社区  ›  Razvan Zamfir

是什么原因导致这个Angular 16电影应用程序中的类型错误导致属性不存在?

  •  0
  • Razvan Zamfir  · 技术社区  · 2 年前

    我一直在用Angular 16、TypeScript和电影数据库(TMDB)制作SPA。

    我在显示电影细节时遇到了一个问题。

    在里面 app\services\movie-service.service.ts 我有:

    import { Injectable } from '@angular/core';
    import { Observable } from 'rxjs';
    import { environment } from '../../environments/environment';
    import { HttpClient } from '@angular/common/http';
    import { MovieResponse } from '../models/Movie';
    import { Genre, GenreResponse } from '../models/Genre';
    
    @Injectable({
      providedIn: 'root'
    })
    
    export class MovieService {
    
      constructor(private http: HttpClient) { }
    
    
      public getLatestMovies(): Observable<MovieResponse> {
        return this.http.get<MovieResponse>(`${environment.apiUrl}/movie/now_playing?api_key=${environment.apiKey}`);
      }
    
      public getMovieDetails(id: Number): Observable<MovieResponse>{
        return this.http.get<MovieResponse>(`${environment.apiUrl}/movie/${id}?api_key=${environment.apiKey}`);
      }
    }
    

    在里面 app\models\Movie.ts 我有:

    export interface Movie {
        id?: number;
        adult?: boolean;
        backdrop_path?: string;
        poster_path?: string;
        title?: string;
        original_title?: string;
        tagline?: string;
        overview?: string;
        genre_ids?: any;
        release_date?: string;
        runtime?: number;
        vote_average?: string;
    }
    
    export interface MovieResponse {
        results?: Movie[];
        total_pages?: number;
        total_results?: number;
        page?: number;
    }
    

    在里面 app\components\movie-details\movie-details.component.ts 我有:

    import { Component } from '@angular/core';
    import { MovieResponse, Movie } from '../../models/Movie';
    import { MovieService } from '../../services/movie-service.service';
    import { ActivatedRoute } from '@angular/router';
    
    @Component({
      selector: 'app-movie-details',
      templateUrl: './movie-details.component.html',
      styleUrls: ['./movie-details.component.scss']
    })
    export class MovieDetailsComponent {
    
      constructor(private movieService: MovieService, private activatedRoute: ActivatedRoute) { }
    
      public movieResponse!: MovieResponse;
      public movie_id: Number = 0;
    
      public showMovieDetails() {
        this.movie_id = Number(this.activatedRoute.snapshot.paramMap.get('id'));
    
        this.movieService.getMovieDetails(this.movie_id).subscribe((response) => {
          this.movieResponse = response;
        });
      }
    
      ngOnInit() {
        this.showMovieDetails();
      }
    }
    

    在里面 app\components\movie-details\movie-details.component.html 我试着显示电影的标题:

    <div *ngIf="movieResponse">
      <h1>{{ movieResponse?.original_title }}</h1>
    </div>
    

    这个问题

    除了所需的结果,我在浏览器中得到了以下错误:

    TS2339: Property 'original_title' does not exist on type 'MovieResponse'.
    

    问题

    1. 我做错了什么?
    2. 解决此问题最可靠的方法是什么?
    1 回复  |  直到 2 年前
        1
  •  0
  •   Yassin Mo    2 年前

    此属性“original_title”在“MovieResponse”接口上不存在,在“Movie”接口上存在 所以你必须更改这一行:

      public movieResponse!: MovieResponse;
    

      public movieResponse!: Movie;
    

    并更新服务:

      public getMovieDetails(id: Number): Observable<Movie>{
        return this.http.get<Movie>(`${environment.apiUrl}/movie/${id}?api_key=${environment.apiKey}`);
      }
    
    推荐文章