Validiere 'any'-Objekt gegen eine Schnittstelle in TypeScript zur Laufzeit [duplizieren]

8

Ich arbeite an der Benutzeroberfläche einer App mit Typoskript. Gleichzeitig arbeiten andere daran, mir Daten zur Verfügung zu stellen. Wir haben uns auf den Datenvertrag geeinigt, aber der Prozess ist fehleranfällig und ich bekomme immer wieder ungültige Datenobjekte vom Server. Also meine Frage ist, kann ich irgendwie dynamische Objekte (zur Laufzeit) mit einigen meiner Schnittstellen in Typoskript validiert validieren?

Diese Frage wurde 2012 gestellt und kann daher kein Duplikat von Überprüfen Sie, ob ein Objekt zur Laufzeit eine Schnittstelle mit TypeScript implementiert hat , die im Jahr 2015 gestellt wurde.

    
Aleksey Bykov 12.10.2012, 22:35
quelle

3 Antworten

8

Da es sich bei TypeScript-Interfaces um reine Kompilierzeit-Entities handelt, gibt es keine Möglichkeit, irgendeine Art von Runtime-Validierung durchzuführen, geschweige denn zu wissen, welche Interfaces zur Kompilierzeit existierten. Daher scheint die Antwort eine der folgenden zu sein:

  1. Schreiben Sie ein Tool zum Konvertieren von TypeScript-Schnittstellen in eine Laufzeitobjektdarstellung, mit der Sie Ihre Objekte validieren können, oder:
  2. Duplizieren Sie Ihre TypeScript-Schnittstellen als eine Laufzeitobjektdarstellung

Sie könnten das JSON-Schema als Laufzeitdarstellung verwenden, da auf Github viele Validatoren vorhanden sind. Eine TypeScript-Schnittstelle - & gt; JSON Schema Converter ist etwas, was ich hoffe, dass jemand irgendwann macht, aber soweit ich weiß, existiert es noch nicht.

    
Brian Terlson 12.10.2012 22:43
quelle
5

Wie Brian hervorhebt, manifestieren sich Interfaces nur zur Kompilierzeit und werden vom Compiler als sogenannte benannte Typen verwendet. Abschnitt 7 der Sprachspezifikation beschreibt dies wie folgt:

  

Schnittstellen haben keine Laufzeitdarstellung - sie sind lediglich ein Kompilierzeitkonstrukt. Schnittstellen sind besonders nützlich zum Dokumentieren und Validieren der erforderlichen Form von Eigenschaften, von Objekten, die als Parameter übergeben werden, und von Objekten, die von Funktionen zurückgegeben werden.

Weiter unten in Abschnitt 7.2 der Spezifikation gibt es eine schöne Beschreibung von dynamischen Typprüfungen in Typoskript:

  

TypeScript bietet keinen direkten Mechanismus zum dynamischen Testen, ob ein Objekt eine bestimmte Schnittstelle implementiert. Stattdessen kann TypeScript-Code die JavaScript-Technik verwenden, um zu prüfen, ob auf dem Objekt eine geeignete Gruppe von Elementen vorhanden ist ...

Das Beispiel in der Spezifikation definiert drei Schnittstellen:

%Vor%

MoverShaker kombiniert Mover und Shaker zu einer neuen Verbundschnittstelle. Um zur Laufzeit zu validieren, dass ein bestimmter Typ die Schnittstelle MoverShaker erfüllt, können Sie den folgenden JavaScript-Code verwenden:

%Vor%

Um die Art der Kompilierung in Typescript überprüfen zu können, müssen Sie Schnittstellen für die Typen definieren, die zwischen den beiden Teilen Ihrer Anwendung ausgetauscht werden. Derzeit müssen Sie den dynamischen Prüfcode (wie oben) manuell schreiben. Daher können der statische Typ und der dynamische Prüfcode irgendwann abweichen, wenn Sie vergessen, sie synchron zu aktualisieren. Wie Brian hervorhebt, wäre es schön, ein Werkzeug zu haben, das den Code automatisch erzeugt.

    
Valentin 13.10.2012 08:59
quelle
1

Probiere meinen dynamischen Interface-Checker, wenn du willst, hier ist ein Beispiel ( vollständiges Beispiel ):

%Vor%

Wenn Code, der zu scratch({ intact: 42, color: Color.RED }) entspricht, aufgerufen wird, wird ein Fehler wie dieser ausgelöst:

%Vor%

Siehe die Hauptseite für Anweisungen: Ссылка

Ich würde automatische Typprüfung hinzufügen, aber ich brauche etwas wie node-falafel für TypeScript.

>     
Janus Troelsen 16.10.2012 01:07
quelle