Ich vermute, dass TypeScript (mit Bedacht) das Curly-Gesetz einhält und Typescript ein Transpiler und kein Objektvalidator ist. Ich denke jedoch auch, dass Typoskript-Schnittstellen zu einer miesen Objektvalidierung führen würden, da Schnittstellen ein (wunderbar) begrenztes Vokabular haben und nicht anhand von Formen validieren können, die andere Programmierer zur Unterscheidung von Objekten verwenden können, wie z. B. Array-Länge, Anzahl der Eigenschaften, Mustereigenschaften usw.
Wenn ich Objekte aus Nicht-Typoskript-Code verwende, verwende ich ein JSONSchema- Validierungspaket wie AJV zur Laufzeitvalidierung und einen .d.ts-Dateigenerator (wie DTSgenerator oder DTS-Generator ), um TypeScript-Typdefinitionen aus my zu kompilieren JSONshcema.
Die größte Einschränkung besteht darin, dass JSON-Schemata Formen beschreiben können, die nicht durch Typoskript unterschieden werden können (z. B. patternProperties) ). Es handelt sich also nicht um eine Eins-zu-Eins-Übersetzung vom JSON-Schema in .t.ds, und Sie müssen möglicherweise etwas Handarbeit leisten Bearbeiten von generierten .d.ts-Dateien bei Verwendung solcher JSON-Schemata.
Da andere Programmierer möglicherweise Eigenschaften wie die Array-Länge verwenden, um auf den Objekttyp zu schließen, habe ich die Gewohnheit, Typen zu unterscheiden, die vom TypeScript-Compiler durch Aufzählungen verwirrt werden könnten, um zu verhindern, dass der Transpiler die Verwendung eines Typs anstelle des Typs akzeptiert andere, wie so:
[MyTypes.yaml]
definitions:
type-A:
type: object
properties:
type:
enum:
- A
foo:
type: array
item: string
maxLength: 2
type-B:
type: object
properties:
type:
enum:
- B
foo:
type: array
item: string
minLength: 3
items: number
Welches erzeugt eine .d.tsDatei wie folgt:
[MyTypes.d.ts]
interface typeA{
type: "A";
foo: string[];
}
interface typeB{
type: "B";
foo: string[];
}