2017-05-24 7 views
1

Ich schreibe einen benutzerdefinierten Typ Guard für mein Angular-Projekt.Lesbarer Weg zum Schreiben komplexer If-Anweisung

Die folgenden if Aussagen (markiert durch meine Kommentare) funktionieren perfekt - aber ich kann nicht helfen, aber denke, es gäbe eine lesbare Möglichkeit, sie zu schreiben.

Die folgenden ersten überprüft, dass die Object, die an die Funktion übergeben wird, die erforderlichen Requisiten hat (und früh beendet, wenn nicht).

Die nächste (und dritte) if Anweisung überprüft den Wert der Stütze activity ist ein String.

Die zweite und vierte if Aussagen müssen, dass die Werte von Requisiten createdAt und updatedAt sind entweder vom Typ String überprüfen, oder dass sie Objekte und dass sie ihre eigenen Requisiten .sv haben die Werte ist, ist der String timestamp.

Es kann in der Tat eine bessere eine lesbarere Möglichkeit geben, die gesamte Funktion zu schreiben ?!

+0

Zuerst müssen Sie Ihre Logik Fällen trennen, dann möchten Sie vielleicht ternäre verwenden für binäre Fälle (nur ein, wenn sie mit anderen) und Schaltergehäuse für mehrere Fälle verwenden (mehr als eine if), das So wird Ihr Code gut lesbar sein. Ich frage mich nur, warum verwenden Sie leere Anweisungen? – ProllyGeek

+0

Ich glaube, Sie haben ein Problem mit der 'Every'-Anweisung. Das 'return false' gibt Ihre' isGridMetadata' -Funktion nicht zurück, es gibt nur die anonyme Funktion zurück, die an 'every' übergeben wird. –

Antwort

2

Zuerst wird der jeder Wert nicht überall gespeichert. Und Sie können direkt den Scheck zurück:

var objHasPropertiesInTheList = [ 'activity', 'createdAt', 'totalReps', 'updatedAt' ].every((prop) => { 
    return obj.hasOwnProperty(prop); 
    }); 

Jetzt objHasPropertiesInTheList falsch sein, wenn in dem Objekt gibt es nicht all diese Eigenschaften in der Liste. Fügen Sie also hier den Haken hinzu und tun Sie, was Sie brauchen, wenn nicht alle Eigenschaften vorhanden sind.

Dann folgt aus:

if (typeof obj.createdAt === 'string') {} 
    else if (obj.createdAt.hasOwnProperty('.sv') && obj.createdAt['.sv'] === 'timestamp') {} 
    else return false; 

kann einfach sein:

if (typeof(obj.createdAt) !== 'string' && obj.createdAt['.sv'] !== 'timestamp') { 
    return false; 
} 

Und gleiche gilt für die zuletzt:

if (typeof(obj.updatedAt) !== 'string' && obj.updatedAt['.sv'] !== 'timestamp') { 
    return false; 
} 
0

Wenn ich keine Fehler machen:

if (typeof obj.activity !== 'string' || 
    (!typeof obj.createdAt === 'string' && !(obj.createdAt.hasOwnProperty('.sv') && obj.createdAt['.sv'] === 'timestamp') || 
    typeof obj.totalReps !== 'number' || 
    (!typeof obj.updatedAt === 'string' && !(obj.updatedAt.hasOwnProperty('.sv') && obj.updatedAt['.sv'] === 'timestamp')) { 
    return false; 
} else { 
    return true; 
} 
+0

Entschuldigung, wenn ich falsch bin, aber ich kann nicht sehen, wie das funktionieren würde. Ich müsste innerhalb einer Schleife sein, um 'obj.hasOwnProperty (prop) 'zu überprüfen, sonst ist' prop 'nicht definiert. Wenn ich in einer Schleife wäre, würde die Aussage sicherlich "falsch" zurückgeben, da selbst wenn die Kriterien für diese "Stütze" erfüllt wären, die anderen drei Eigenschaften nicht existieren würden und daher fehlschlagen würden? –

+0

Sorry, ich habe es falsch gelesen, lass mich meine Antwort bearbeiten – trichetriche

+0

Fertig, jetzt sollte es in Ordnung sein – trichetriche

0

Ich denke, einen gleichwertigen und kompakten Weg, um es neu zu schreiben ist:

function validateDateProperty(obj, dateProp) { 
 
    const dateVal = obj[dateProp]; 
 
    return typeof dateVal === 'string' || (dateVal.hasOwnProperty('.sv') && dateVal['.sv'] === 'timestamp'); 
 
} 
 

 
export function isGridMetadata(obj : any) : obj is GridMetadata { 
 
    if !(['activity', 'createdAt', 'totalReps', 'updatedAt'].every(prop => obj.hasOwnProperty(prop))) { 
 
     return false; 
 
    } 
 
    return (
 
     typeof obj.activity === 'string' 
 
     && typeof obj.totalReps === 'number' 
 
     && validateDateProperty(obj, 'createdAt') 
 
     && validateDateProperty(obj, 'updatedAt')   
 
    ); 
 
}

Verwandte Themen