2016-06-06 12 views
87

Niedawno oglądałem samouczek na Angular 2 z TypeScript, ale nie wiem, kiedy używać interfejsu i kiedy używać modelu do przechowywania struktur danych.Kiedy używać interfejsu i modelu w TypeScript/Angular2

Przykład interfejsu:

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

Przykład Model:

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

Chcę załadować dane JSON z URL i powiązania z interfejsem/Model. Czasami chcę jednego obiektu danych, innym razem chcę trzymać i tablicy obiektu.

Których należy użyć i dlaczego?

+6

Używaj klasy, gdy potrzebujesz niestandardowego init logicznego, w przeciwnym razie ** zawsze ** korzystasz z interfejsu, ponieważ jest on dostępny tylko w czasie kompilacji. Interfejs typu maszynopis nie jest skompilowany do javascript, ponieważ nie istnieje w javascript. – Dieterg

+4

Należy pamiętać, że interfejsy NIE będą działały z wtryskiem zależności w Angular 2. Tutaj będziesz musiał użyć klas. – jlang

Odpowiedz

67

Interfejsy są tylko w czasie kompilacji. Pozwala to tylko sprawdzić, czy oczekiwane dane otrzymane są zgodne z określoną strukturą. Do tego można przesyłać treści do tego interfejsu:

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

Zobacz te pytania:

można zrobić coś podobnego z klasy, ale główne różnice z klasą są takie, że są obecne w środowisku wykonawczym (funkcja konstruktora) i możesz definiować w nich metody przetwarzania. Ale w tym przypadku, trzeba wystąpień obiektów, aby móc z nich korzystać:

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

Dziękujemy za szczegółową odpowiedź. Jeśli interfejs jest używany tylko w czasie kompilacji, w jaki sposób kompilator może sprawdzić strukturę pliku JSON bez faktycznego sprawdzania http get? Jeśli tak nie jest, to jaki jest sens nawet kłopot z interfejsem? –

+4

@I_LIKE_FOO kompilator nie musi sprawdzać połączenia pobierania. Dbamy tylko o sprawdzanie typów, o których wie i czy są one prawidłowo wyrównane. 'var data = res.json();' to naprawdę 'var data: any = res.json();' do kompilatora, więc tracimy wszystkie sprawdzanie typów na 'danych'. Bardziej użyteczne byłoby coś takiego jak 'var data: ProductDto [] = res.json(); 'z' ProductDto' będącym interfejsem, który modeluje strukturę danych w zwróconym jsonie. – GFoley83

+1

Więcej: 'Kątowy przewodnik po stylu mówi, że nie należy używać interfejsów.Zawsze korzystaj z klas. Patrz https://angular.io/guide/styleguide#style-03-03 – Sampath

23

Interfejs opisuje albo umowę na klasy lub nowej typ. Jest to czysty element typu Maszynopis, więc nie ma wpływu na JavaScript.

Model, a mianowicie klasa, jest faktyczną funkcją JS, która jest używana do generowania nowych obiektów.

Chcę załadować dane JSON z adresu URL i powiązać interfejs/model.

Przejdź do modelu, w przeciwnym razie nadal będzie JSON w JavaScript.

Powiązane problemy