Tenho trabalhado em um SPA com Angular 16, TypeScript e The Movie Database (TMDB).
Em app\services\movie-service.service.ts
eu tenho:
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { environment } from '../../environments/environment';
import { HttpClient } from '@angular/common/http';
import { MovieResponse, Movie } from '../models/Movie';
@Injectable({
providedIn: 'root'
})
export class MovieService {
constructor(private http: HttpClient) { }
public getMovies(): Observable<MovieResponse[]> {
return this.http.get<MovieResponse[]>(`${environment.apiUrl}/movie/now_playing?api_key=${environment.apiKey}`);
}
}
O modelo app\models\Movie.ts
fica assim:
export interface Movie {
id?: number;
adult?: boolean;
backdrop_path?: string;
poster_path?: string;
title?: string;
tagline?: string;
overview?: string;
genre_ids?: any;
original_title?: string;
release_date?: string;
runtime?: number;
vote_average?: string;
}
export interface MovieResponse {
results?: Movie[];
total_pages?: number;
total_results?: number;
page?: number;
}
No HomePageComponent
eu tento produzir os filmes:
import { Component } from '@angular/core';
import { MovieResponse, Movie } from '../../models/Movie';
import { MovieService } from '../../services/movie-service.service';
@Component({
selector: 'app-home-page',
templateUrl: './home-page.component.html',
styleUrls: ['./home-page.component.scss']
})
export class HomePageComponent {
public movieResponse!: MovieResponse[];
public movies: Movie[] = [];
constructor(private movieService: MovieService) { }
public getMovies() {
this.movieService.getMovies().subscribe((response) => {
this.movieResponse = response;
console.log(this.movieResponse);
this.movies = this.movieResponse.results;
})
}
ngOnInit() {
this.getMovies();
}
}
A linha console.log(this.movieResponse)
mostra basicamente a resposta com o results
arário, total_pages
, etc;
O problema
A linha this.movies = this.movieResponse.results
causa o erro:
TS2339: Property 'results' does not exist on type 'MovieResponse[]'.
Questões
- O que estou fazendo de errado?
- Qual é a maneira mais confiável de corrigir esse problema?
O
movieResponse
possui uma matriz de objetos ( resposta do filme ), cada um com sua própria propriedade de resultados!Como a carga útil da solicitação não é compartilhada, podemos apenas acessar o
results
primeiro elemento!Você pode acessar apenas um elemento do array, em vez de acessar o array inteiro!
Se da API você receber apenas uma resposta de filme, será necessário alterar o código abaixo. Onde podemos substituir
MovieResponse[]
porMovieResponse
ts