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 Descriptorals 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 valuewird getippt, da Stringund Booleanbeide "Transformatoren" in dem Sinne sind, dass sie Eingaben nehmen und eine getippte Ausgabe zurückgeben.
Darüber hinaus ist der valueWille tatsächlich , dass Art. Mit anderen Worten, wenn dies nametatsächlich der 123Fall wäre , wird es so transformiert, "123"dass Sie eine gültige Zeichenfolge haben. Dies liegt daran, dass wir zur StringLaufzeit 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 valueDefinition, um anzuzeigen, dass im Popup der richtige Typ angezeigt wird.
- Versuchen Sie ,
"Bob"auf 123und die Probe erneut aus. In Ihrer Konsole sehen Sie, dass der Name ordnungsgemäß in die Zeichenfolge konvertiert wurde "123".