Typescript with TypeLite - Laufzeit-Typprüfung

Nehmen wir an, ich habe einige C # -DTOs und möchte sie mit T4-Vorlagen und einer kleinen Bibliothek namens TypeScript-Schnittstellen konvertierenTypeLite

Auf der Clientseite habe ich einige konkrete TypeScript-Klassen (die von Backbone.Model erben, aber das ist nicht wichtig), die dasselbe DTO darstellen, das auf der Serverseite definiert ist.

Das beabsichtigte Ziel der Schnittstellen besteht darin, als Datenverträge zu fungieren und sicherzustellen, dass Client- und Server-DTOs synchron gehalten werden.

Dies ist jedoch problematisch, da TypeScript keine anderen Laufzeit-Typprüffunktionen als unterstütztinstanceof. Das Problem mit instance of ist, dass es sich beim Abrufen meiner DTOs vom Server um reine JSON-Objekte und nicht um Instanzen meines Modells handelt. Ich muss die Typüberprüfung zur Laufzeit für diese DTOs durchführen, die vom Server als JSON-Objekte eingehen.

Ich weiß, dass ich so etwas machen kann:

collection.fetch({...}).done((baseModels) => {
     baseModels.forEach((baseModel) => {
           if(baseModel&& baseModel.SomeProperty && baseModel.SomeOtherProperty){
                //JSON model has been "type-checked"
           }
     });
});

Dies hat jedoch offensichtliche Probleme, da ich jetzt ein Update durchführen mussdrei Orte, wenn ich eine Eigenschaft ändere oder hinzufüge.

Derzeit ist das einzige, was ich gefunden habediese Aber es ist undokumentiert, wird nicht gewartet und verwendet Knoten, mit denen ich keine Erfahrung habe, sodass ich mir die Frustration ersparen kann. Kennt jemand etwas Ähnliches, um eine Laufzeit-Typprüfung in TypeScript oder auf eine andere Weise durchzuführen, um das zu erreichen, wonach ich strebe?

Es wäre großartig, wenn dies in TypeLite integriert wäre, um die Schnittstellen sowie ein JSON-Schema für die Typprüfung zur Laufzeit zu generieren. Daß dieses Projekt istOpen Source jemand sollte wirklich weitermachen und es erweitern. Ich würde zumindest ein paar Hinweise brauchen, wenn ich es selbst machen würde (daher die Frage).

Weitere Details zu meinem speziellen ProblemHier (nicht notwendig, aber bei Bedarf zusätzlicher Kontext)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage