Quando usar a Interface e o Modelo no TypeScript / Angular2

197

Recentemente, assisti a um Tutorial sobre Angular 2 com TypeScript, mas não sabia quando usar uma Interface e quando usar um Modelo para armazenar estruturas de dados.

Exemplo de interface:

export interface IProduct {
    ProductNumber: number;
    ProductName: string;
    ProductDescription: string;
}

Exemplo de modelo:

export class Product {
    constructor(
        public ProductNumber: number,
        public ProductName: string,
        public ProductDescription: string
    ){}
}

Desejo carregar dados JSON de uma URL e vincular à Interface / Modelo. Em algum momento, quero um único objeto de dados, em outro momento, desejo manter e matriz do objeto.

Qual devo usar e por quê?

I_LIKE_FOO
fonte
13
Use uma classe quando precisar de init lógico personalizado; caso contrário, sempre use uma interface, pois ela estará disponível apenas no momento da compilação. Uma interface datilografada não é compilada para javascript, pois não existe em javascript.
Dieterg 6/06/16
6
Lembre-se de que as interfaces NÃO funcionarão com injeção de dependência no Angular 2. Aqui você terá que usar classes.
jlang

Respostas:

137

As interfaces são apenas em tempo de compilação. Isso permite apenas que você verifique se os dados esperados recebidos seguem uma estrutura específica. Para isso, você pode transmitir seu conteúdo para esta interface:

this.http.get('...')
    .map(res => <Product[]>res.json());

Veja estas perguntas:

Você pode fazer algo semelhante com a classe, mas as principais diferenças com a classe são que elas estão presentes no tempo de execução (função construtora) e é possível definir métodos nelas com o processamento. Mas, nesse caso, você precisa instanciar objetos para poder usá-los:

this.http.get('...')
    .map(res => {
      var data = res.json();
      return data.map(d => {
        return new Product(d.productNumber,
          d.productName, d.productDescription);
      });
    });
Thierry Templier
fonte
27
Obrigado pela sua resposta detalhada. Se a interface for usada apenas no momento da compilação, como o compilador pode verificar a estrutura do arquivo JSON sem realmente examinar o http get? Se não puder, qual é o sentido de se preocupar com uma interface?
I_LIKE_FOO 6/06/2016
7
@I_LIKE_FOO o compilador não precisa examinar a chamada get. Só se preocupa em verificar os tipos que conhece e se estão alinhados corretamente. var data = res.json();é realmente var data: any = res.json();para o compilador, então perdemos todo o tipo de verificação data. O que seria mais útil aqui seria algo como var data: ProductDto[] = res.json();com ProductDtosendo uma interface que modela a estrutura de dados do JSON retornado.
GFoley83
3
Mais: Angular style guide says not to use interfaces.Always use classes.Veja angular.io/guide/styleguide#style-03-03
Sampath
4
Sim, mas o problema é que eles não são os deuses do guru que criaram o Typcript. Isso seria Microsoft e empresa. Eles tendem a favorecer interfaces e classes quando apropriado. Também pontos de bônus ... é tempo de execução e outro é em tempo de compilação
Tom Stickel
11
@Sampath Talvez o guia de estilo Angular tenha sido atualizado, pois agora vejo este item "Considere usar uma interface para modelos de dados". Implica que a interface prefere a classe aos modelos de dados.
6138 Mikezx6r
40

A interface descreve um contrato para uma classe ou um novo tipo . É um elemento puro do TypeScript, portanto, não afeta o Javascript.

Um modelo, e nomeadamente uma classe , é uma função JS real que está sendo usada para gerar novos objetos.

Desejo carregar dados JSON de uma URL e vincular à Interface / Modelo.

Escolha um modelo, caso contrário, ele ainda será JSON no seu Javascript.

pietro909
fonte
4

Como o @ThierryTemplier disse para receber dados do servidor e também transmitir o modelo entre os componentes (para manter a lista intellisense e cometer erros de tempo de design), é bom usar a interface, mas acho que para enviar dados ao servidor (DTOs) é melhor usar a classe para tirar vantagens do DTO de mapeamento automático do modelo.

M_Farahmand
fonte
-22

Use Classe em vez de Interface, o que eu descobri depois de toda a minha pesquisa.

Por quê? Uma classe sozinha é menos código que uma interface de classe mais. (de qualquer maneira, você pode exigir uma classe para o modelo de dados)

Por quê? Uma classe pode atuar como uma interface (use implementos em vez de estende).

Por quê? Uma classe de interface pode ser um token de pesquisa de provedor na injeção de dependência angular.

do Angular Style Guide

Basicamente, uma classe pode fazer tudo, o que uma interface fará. Portanto, talvez nunca seja necessário usar uma interface .

Sajith Mantharath
fonte
10
Atualmente, o Angular Style Guide diz: “ Considere usar uma interface para modelos de dados.
Alex Peters
@AlexPeters Forneça qualquer link autêntico. Agradecemos antecipadamente
Anand Phadke
@ AnandPhadke, aqui está um link do Wayback Machine para o Angular Style Guide na época do meu comentário acima.
Alex Peters