Niedawno obejrzałem samouczek na temat Angulara 2 z TypeScript, ale nie jestem pewien, kiedy użyć interfejsu, a kiedy modelu do przechowywania struktur danych.
Przykład interfejsu:
export interface IProduct {
ProductNumber: number;
ProductName: string;
ProductDescription: string;
}
Przykład modelu:
export class Product {
constructor(
public ProductNumber: number,
public ProductName: string,
public ProductDescription: string
){}
}
Chcę załadować dane JSON z adresu URL i powiązać z interfejsem / modelem. Czasami chcę pojedynczy obiekt danych, innym razem chcę trzymać i tablicę obiektu.
Którego powinienem użyć i dlaczego?
angular
typescript
I_LIKE_FOO
źródło
źródło
Odpowiedzi:
Interfejsy są dostępne tylko podczas kompilacji. Pozwala to tylko na sprawdzenie, czy oczekiwane dane mają określoną strukturę. W tym celu możesz przesłać zawartość do tego interfejsu:
Zobacz te pytania:
Możesz zrobić coś podobnego z klasą, ale główne różnice z klasami polegają na tym, że są one obecne w środowisku uruchomieniowym (funkcja konstruktora) i możesz definiować w nich metody podczas przetwarzania. Ale w tym przypadku musisz utworzyć instancję obiektów, aby móc z nich korzystać:
źródło
var data = res.json();
jest naprawdęvar data: any = res.json();
dla kompilatora, więc tracimy sprawdzanie wszystkich typówdata
. Jaki byłby bardziej przydatny byłby tu cośvar data: ProductDto[] = res.json();
zProductDto
czym interfejs, który modeluje strukturę danych w zwróconym JSON.Angular style guide says not to use interfaces.Always use classes.
patrz angular.io/guide/styleguide#style-03-03Interfejs opisuje albo umowę na klasy lub nowego typu . Jest to czysty element Typescript, więc nie wpływa na Javascript.
Model, a mianowicie klasa , jest faktyczną funkcją JS używaną do generowania nowych obiektów.
Wybierz model, w przeciwnym razie w JavaScript będzie nadal JSON.
źródło
Jak powiedział @ThierryTemplier do odbierania danych z serwera, a także do przesyłania modelu między komponentami (aby zachować listę intellisense i popełnić błąd czasu projektowania), dobrze jest użyć interfejsu, ale myślę, że do wysyłania danych na serwer (DTO) lepiej jest użyć klasy, aby wziąć zalety automatycznego mapowania DTO z modelu.
źródło
Użyj klasy zamiast interfejsu , co odkryłem po wszystkich moich badaniach.
Czemu? Sama klasa to mniej kodu niż interfejs klasy plus. (w każdym razie możesz wymagać klasy dla modelu danych)
Czemu? Klasa może działać jako interfejs (użyj narzędzi zamiast rozszerzeń).
Czemu? Klasa interfejsu może być tokenem wyszukiwania dostawcy we wstrzykiwaniu zależności kątowej.
z Angular Style Guide
Zasadniczo klasa może zrobić wszystko, co zrobi interfejs. Dlatego może nigdy nie będzie konieczne użycie interfejsu .
źródło