TypeScript strict Klasse / Schnittstelle

8

Ich verwende TypeScript Version 2.3.4. Ich möchte eine Funktion schreiben, die ein Objekt akzeptiert, das bestimmte Felder haben muss. Dieses Objekt sollte jedoch keine anderen Felder enthalten. Wie kann ich das erreichen?

Das funktioniert jetzt nur, wenn ich das Objekt inline definiere. Aber wenn ich ein anderes Objekt mit zusätzlichen Feldern verwende - der Compiler wird es erlauben. Was ist völlig falsch.

Beispiel:

%Vor%

Der gleiche Code kann mit Schnittstellen, Klassen, Typdeklarationen geschrieben werden - es ist das gleiche Problem.

Nun muss ich die Felder manuell aus dem Objekt extrahieren, um sicherzustellen, dass es keine zusätzlichen Felder gibt. Aber ich kann diese Lösung nicht auf ~ 1000 Funktionen (ich brauche das wirklich) über den ganzen Code verteilen - es ist zu chaotisch. Ich erstelle einen API-Wrapper und muss sicherstellen, dass keine zusätzlichen oder falschen Felder an den Server übergeben werden.

    
Harry Burns 20.06.2017, 06:37
quelle

4 Antworten

2

Die von Ihnen gewünschte Funktion wird als " genaue Typen " bezeichnet.
Es wird betrachtet, das heißt weder abgelehnt noch akzeptiert, und die Diskussion geht weiter.

    
artem 20.06.2017, 07:08
quelle
2

Nekromantieren.
Es kommt mit Typoskript 2.4:

%Vor%

Und um es zu erzwingen ist ein Objekt, wenn alle Parameter optional sind:

%Vor%

Und wenn Sie eine Zeichenfolge oder einen anderen Objekttyp übergeben möchten:

%Vor%     
User1 23.06.2017 15:15
quelle
1

So funktioniert es, und ich bin mir nicht sicher, ob Sie das schaffen können. Weitere Informationen finden Sie in den Dokumenten .

Was Sie auch falsch machen - Sie können sich nicht 100% ig sicher sein, was an den Server gesendet wird. Solange der Browser nichts über TS weiß, kann irgendeine Bibliothek in irgendeine Anfrage einspeisen, was auch immer sie benötigt, z.B. indem Sie die XmlHttpRequest-Methoden überschreiben (dies ist z. B. mindestens die von zone.js von angular).

Eine andere Möglichkeit, Ihre Absichten leicht zu durchbrechen, ist die Verwendung von <any> vor jedem übergebenen Parameter.

TypeScript soll Ihren Entwicklungsprozess verbessern, aber ich denke nicht, dass es für Ihre Bedürfnisse verwendet werden kann. Dies wird normalerweise durch das Schreiben der richtigen Tests abgedeckt.

    
smnbbrv 20.06.2017 06:46
quelle
1

Da ist "ein" Weg, aber Sie müssen es selbst implementieren. Es heißt "User Defined Type Guard" und sieht so aus:

%Vor%     
Rahul Singh 20.06.2017 06:48
quelle

Tags und Links