Quando utilizzare l'interfaccia e il modello in TypeScript / Angular2


197

Di recente ho visto un Tutorial su Angular 2 con TypeScript, ma non sono sicuro di quando utilizzare un'interfaccia e quando utilizzare un modello per contenere le strutture di dati.

Esempio di interfaccia:

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

Esempio di modello:

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

Voglio caricare i dati JSON da un URL e collegarli all'interfaccia / al modello. A volte voglio un singolo oggetto dati, altre volte voglio tenere e array dell'oggetto.

Quale dovrei usare e perché?


13
Utilizzare una classe quando è necessario un init di logica personalizzato, altrimenti utilizzare sempre un'interfaccia poiché è disponibile solo al momento della compilazione. Un'interfaccia dattiloscritta non è compilata in javascript poiché non esiste in javascript.
Dieterg,

6
Tieni presente che le interfacce NON funzioneranno con l'iniezione di dipendenza in Angular 2. Qui dovrai usare le classi.
jlang,

Risposte:


137

Le interfacce sono solo in fase di compilazione. Ciò consente solo a te di verificare che i dati previsti ricevuti seguano una struttura particolare. Per questo puoi trasmettere i tuoi contenuti a questa interfaccia:

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

Vedi queste domande:

Puoi fare qualcosa di simile con la classe ma le principali differenze con la classe sono che sono presenti in fase di esecuzione (funzione di costruzione) e puoi definire metodi in esse con l'elaborazione. Ma, in questo caso, devi istanziare gli oggetti per poterli usare:

this.http.get('...')
    .map(res => {
      var data = res.json();
      return data.map(d => {
        return new Product(d.productNumber,
          d.productName, d.productDescription);
      });
    });

27
Grazie per la tua risposta dettagliata. Se l'interfaccia viene utilizzata solo in fase di compilazione, come può il compilatore controllare la struttura del file JSON senza esaminare effettivamente http? Se ciò non è possibile, qual è il punto di preoccuparsi persino di un'interfaccia?
I_LIKE_FOO,

7
@I_LIKE_FOO il compilatore non ha bisogno di esaminare la chiamata get. Si preoccupa solo di controllare i tipi che conosce e che sono correttamente allineati. var data = res.json();è davvero var data: any = res.json();per il compilatore, quindi perdiamo tutto il controllo del tipo data. Quale potrebbe essere più utile qui sarebbe qualcosa di simile var data: ProductDto[] = res.json();con ProductDtoessendo un'interfaccia che modelli la struttura dei dati in JSON restituito.
GFoley83,

3
Altro: Angular style guide says not to use interfaces.Always use classes.vedi angular.io/guide/styleguide#style-03-03
Sampath

4
Sì, ma il problema è che non sono gli dei guru che hanno progettato Typescript. Sarebbe Microsoft e società. Tendono a favorire interfacce e classi quando appropriato. Anche punti bonus ... uno è runtime e l'altro è in fase di compilazione
Tom Stickel,

11
@Sampath Forse la guida di stile angolare è stata aggiornata come ora vedo questo "Considerare di utilizzare un'interfaccia per i modelli di dati". Implica preferire l'interfaccia alla classe per i modelli di dati.
Mikezx6r,

40

L' interfaccia descrive un contratto per una classe o un nuovo tipo . È un puro elemento dattiloscritto, quindi non influisce su Javascript.

Un modello, e cioè una classe , è una vera funzione JS che viene utilizzata per generare nuovi oggetti.

Voglio caricare i dati JSON da un URL e collegarli all'interfaccia / al modello.

Scegli un modello, altrimenti sarà comunque JSON nel tuo Javascript.


4

Come ha detto @ThierryTemplier per la ricezione di dati dal server e anche per la trasmissione di modelli tra i componenti (per mantenere l'elenco intellisense e fare errori in fase di progettazione), va bene usare l'interfaccia ma penso che per inviare dati al server (DTO) sia meglio usare la classe per prendere vantaggi del mapping automatico DTO dal modello.


-22

Usa Class invece di Interface che è quello che ho scoperto dopo tutte le mie ricerche.

Perché? Una sola classe è meno codice di un'interfaccia class-plus. (comunque potresti richiedere una Classe per modello di dati)

Perché? Una classe può fungere da interfaccia (usa gli attrezzi invece di estensioni).

Perché? Una classe di interfaccia può essere un token di ricerca del provider nell'iniezione di dipendenza angolare.

dalla Guida allo stile angolare

Fondamentalmente una classe può fare tutto, cosa farà un'interfaccia. Quindi potrebbe non essere necessario utilizzare un'interfaccia .


10
La Guida allo stile angolare attualmente dice effettivamente: “ Prendi in considerazione l'uso di un'interfaccia per i modelli di dati. "
Alex Peters,

@AlexPeters Fornire qualsiasi collegamento autentico. Grazie in anticipo
Anand Phadke il

@AnandPhadke certo, ecco un link Wayback Machine alla Guida angolare di stile di circa il tempo del mio commento sopra.
Alex Peters,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.