Wenn Ihr JSON einen validierten Typescript-Typ haben soll, müssen Sie diese Validierungsarbeit selbst ausführen. Das ist nichts Neues. In einfachem Javascript müssten Sie dasselbe tun.
Validierung
Ich möchte meine Validierungslogik als eine Reihe von "Transformationen" ausdrücken. Ich definiere a Descriptor
als Karte von Transformationen:
type Descriptor<T> = {
[P in keyof T]: (v: any) => T[P];
};
Dann kann ich eine Funktion erstellen, die diese Transformationen auf beliebige Eingaben anwendet:
function pick<T>(v: any, d: Descriptor<T>): T {
const ret: any = {};
for (let key in d) {
try {
const val = d[key](v[key]);
if (typeof val !== "undefined") {
ret[key] = val;
}
} catch (err) {
const msg = err instanceof Error ? err.message : String(err);
throw new Error(`could not pick ${key}: ${msg}`);
}
}
return ret;
}
Jetzt validiere ich nicht nur meine JSON-Eingabe, sondern baue auch unterwegs einen Typescript-Typ auf. Die oben genannten generischen Typen stellen sicher, dass das Ergebnis die Typen aus Ihren "Transformationen" ableitet.
Falls die Transformation einen Fehler auslöst (so würden Sie die Validierung implementieren), möchte ich sie mit einem weiteren Fehler umschließen, der anzeigt, welcher Schlüssel den Fehler verursacht hat.
Verwendung
In Ihrem Beispiel würde ich dies wie folgt verwenden:
const value = pick(JSON.parse('{"name": "Bob", "error": false}'), {
name: String,
error: Boolean,
});
Jetzt value
wird getippt, da String
und Boolean
beide "Transformatoren" in dem Sinne sind, dass sie Eingaben nehmen und eine getippte Ausgabe zurückgeben.
Darüber hinaus ist der value
Wille tatsächlich , dass Art. Mit anderen Worten, wenn dies name
tatsächlich der 123
Fall wäre , wird es so transformiert, "123"
dass Sie eine gültige Zeichenfolge haben. Dies liegt daran, dass wir zur String
Laufzeit eine integrierte Funktion verwendet haben, die beliebige Eingaben akzeptiert und a zurückgibt string
.
Sie können dies hier sehen . Versuchen Sie Folgendes, um sich selbst zu überzeugen:
- Bewegen Sie den Mauszeiger über die
const value
Definition, um anzuzeigen, dass im Popup der richtige Typ angezeigt wird.
- Versuchen Sie ,
"Bob"
auf 123
und die Probe erneut aus. In Ihrer Konsole sehen Sie, dass der Name ordnungsgemäß in die Zeichenfolge konvertiert wurde "123"
.