Wie kann ich (zur Laufzeit) prüfen, ob ein unbekanntes Objekt ein bestimmter Typ ist? Und dann formell zu diesem Typ konvertieren und etwas damit machen?Überprüfen Sie, ob ein Objekt ein Google Closure-Typ ist, und konvertieren Sie es?
Ich mag so etwas wie dies zu tun:
const /** {Object} */ someObject = {name: 'Apple', color: 'Red'};
if (someObject is Fruit) {
// Convert to {Fruit} and do something with it.
return /** {Fruit} */ (someObject);
}
wo Fruit
ist eine Klasse mit dem Namen Eigenschaften und Farbe.
Um genauer zu sein, kann ich nicht einfach ein Fruit
Objekt mit einem Konstruktor erstellen, wie ich das Objekt von JSON.parse
bekomme.
Bisher habe ich versucht:
if (someObject instanceof Fruit)
dies falsch gelöst. Und ich habe versucht:
const aFruit = /** @type {Fruit} */ someObj;
Aber dies scheint nicht wirklich etwas zu tun .. das heißt, wenn ich in someObj
übergeben, die nicht Eigenschaften Namen hat oder Farbe es immer noch als Fruit
behandelt wird.
Vielleicht brauche ich eine komplexere/benutzerdefinierte Lösung? Dh ist das in Closure eingebaut oder soll ich die Attribute einfach selbst überprüfen?
Verschlusstypen existieren nur bei der Kompilierung. – SLaks
Mit einigen zusätzlichen Erklärungen, wie Typ Converting '/ ** @type {Fruit} * /' funktioniert/warum es hier nicht funktioniert, würde ich akzeptieren "Sie können nicht; tun dies allein" als Antwort . – hubatish
Der 'instanceof'-Test funktioniert nur, wenn das Objekt mit' new' erstellt wird (oder wenn die JavaScript 'property'-Werte manuell angeordnet werden). Können Sie aus den Eigenschaften heraus testen, um welchen Objekttyp es sich handelt? Wenn dies der Fall ist, können Sie das Typ-Casting verwenden, wie Sie es in Ihrem ersten Beispiel gezeigt haben. – owler