2
respostas

Dúvida sobre a Interface

Quando tipamos o retorno de um objeto com uma interface, ele deve retornar um objeto SOMENTE com os campos definidos nesta interface correto? Abaixo é a interface VolumeInfo que estamos utilizando, nela não tem o campo "previewLink" para fazermos a correlação em "LivroService". Reparei também que os dados do console log, apesar de tiparmos ele, é retornado todos os dados da API...

export interface VolumeInfo {
  title: string;
  authors: string[];
  publisher: string;
  publishedDate: Date;
  description: string;
  pageCount: number;
  printType: string;
  mainCategory: string;
  categories: string[];
  averageRating: number;
  ratingsCount: number;
  contentVersion: string;
  imageLinks: ImageLinks;
  language: string;
  infoLink: string;
  canonicalVolumeLink: string;
}
2 respostas

Olá, Jorge.

Tudo bem?

Entendo sua dúvida e é uma ótima pergunta. Quando você define uma interface em TypeScript, você está essencialmente definindo um "contrato" para a estrutura de um objeto. No entanto, esse contrato não é estritamente aplicado no sentido de que o objeto deve ter somente as propriedades definidas na interface.

O objeto pode ter propriedades adicionais além das definidas na interface. O TypeScript vai verificar se o objeto tem pelo menos as propriedades definidas na interface. Se tiver, então o objeto é considerado como sendo do tipo da interface, mesmo que tenha propriedades adicionais.

No seu caso, a interface VolumeInfo não define a propriedade previewLink, mas isso não impede que o objeto retornado pela API tenha essa propriedade. Quando você faz o log dos dados retornados pela API, você vê todos os dados, incluindo previewLink, porque esses são os dados que a API está realmente retornando, independentemente de como você tipou o retorno.

Aqui está um exemplo para ilustrar isso:

interface Pessoa {
  nome: string;
  idade: number;
}

let joao: Pessoa = {
  nome: "João",
  idade: 25,
  profissao: "Engenheiro" // Esta propriedade não está na interface Pessoa
};

console.log(joao); // { nome: "João", idade: 25, profissao: "Engenheiro" }

No exemplo acima, joao é considerado do tipo Pessoa, mesmo tendo a propriedade adicional profissao.

Espero ter ajudado. Qualquer dúvida manda aqui. Bons estudos.

Obrigado pelo retorno Renan. Entendi o que você falou porém fazendo um simples teste neste mesmo projeto tenho o erro abaixo. Eu criei uma interface de teste, criei um objeto e tentei adicionar uma nova propriedade (profissão) diferente das definidas na interface e este erro aparece. Notei tb que no construto de "LivroVolumeInfo", ele recebe um "item" que não está tipado, portanto ele é um "any", tentei tipa-lo com a interface "Item" e aparece o erro do "previewLink" assim como na imagem. Insira aqui a descrição dessa imagem para ajudar na acessibilidade