Schnittstellenbasierte Programmierung mit TypeScript, Angular 2 & SystemJS

8

Ich versuche gerade, etwas Code aufzuräumen, um gegen Schnittstellen statt gegen Implementierungen zu programmieren, kann aber nicht herausfinden, wie.

Um genauer zu sein, verwende ich: * TypeScript 1.5.0 Beta - & gt; auf ES5 / commonjs übertragen * SystemJS zum Laden der Module

Ich versuche derzeit, externe Module wie folgt zu verwenden:

posts.service.ts Datei:

%Vor%

und dieses Modul wird in posts.t:

importiert %Vor%

Der obige Code wird korrekt kompiliert, aber im Grunde läuft mein Problem darauf hinaus, dass Angular keine Instanz von PostServiceImpl in die Post-Komponente injiziert.

Natürlich liegt es einfach daran, dass ich nicht den richtigen Weg finde, alles zu deklarieren / exportieren / importieren

Ohne export interface PostsService ... bekomme ich TS-Kompilierungsfehler, weil ich sie im Posts-Controller verwende.

Ohne export var PostsService:PostsServiceImpl; bekomme ich TS-Übersetzungsfehler im ViewInjector

des @View-Dekorators

Im generierten js-Code finde ich nur exports.PostsService; , das wegen der Exportvariable hinzugefügt wird ... Ich weiß, dass Schnittstellen zur Laufzeit verschwinden.

Also bin ich ein bisschen verloren in all dem. Irgendwelche praktischen Ideen, wie ich Schnittstellen-basierte Programmierung mit TypeScript & amp; Angular 2?

    
dSebastien 03.07.2015, 08:31
quelle

4 Antworten

6
  

Irgendwelche praktischen Ideen, wie ich Interface-basierte Programmierung mit TypeScript & amp; Angular 2

Schnittstellen werden zur Laufzeit gelöscht. Decorators unterstützen auch keine Schnittstellen. Sie sollten also etwas verwenden, das zur Laufzeit existiert (d. H. Implementierungen).

    
basarat 03.07.2015, 08:34
quelle
4

Sie müssen daran denken, dass Ihre Klasse (und sollte) von Abstraktionen abhängig sein sollte , aber es gibt einen Ort, an dem Sie keine Abstraktion verwenden können: es ist in die Abhängigkeitsinjektion von Angular.

Angular muss wissen, welche Implementierung verwendet werden soll.

Beispiel:

%Vor%

In Ihrem Test können Sie also leicht Mocks verwenden, da alle Ihre Controller / Dienste usw. von Abstraktionen abhängig sind. Aber für die reale Anwendung benötigt eckige Implementierungen.

    
François Petitjean 03.07.2015 09:11
quelle
3

TypeScript erzeugt keine Symbole für Schnittstellen, aber Sie benötigen ein Symbol, um die Abhängigkeitsinjektion zu ermöglichen.

Lösung: Verwenden Sie OpaqueTokens als Ihr Symbol, weisen Sie diesem Token über die Funktion provide () eine Klasse zu und verwenden Sie die Funktion Inject mit diesem Token im Konstruktor Ihrer Klasse.

Im Beispiel hier habe ich davon ausgegangen, dass Sie PostsServiceImpl PostsService in der Post-Komponente zuweisen möchten, da es einfacher ist, zu erklären, wann sich der Code an der gleichen Stelle befindet. Die Ergebnisse des Aufrufs provide () können auch in das zweite Argument von angular.bootstrap (someComponent, arrayOfProviders) oder in das Array [provide] einer Komponente eingefügt werden, die höher als die Post-Komponente in der Hierarchie liegt.

In Komponenten / posts / posts.service.ts:

%Vor%

In Ihrem Konstruktor:

%Vor%     
PotatoEngineer 11.08.2016 03:22
quelle
1

In Typoskripten können Sie Klassen implementieren.

Beispiel

config.service.ts:

%Vor%

app.component.ts:

%Vor%

Sie können dann den Service mit verschiedenen Implementierungen bereitstellen.

    
Matthias 03.01.2017 02:47
quelle

Tags und Links