2015-07-17 3 views
1

Je rencontre parfois un problème avec un objet JavaScript de type inconnu. Ensuite, j'effectue un script de vérification de type et appelle les fonctions appropriées en fonction du type détecté. par exemple. comme celui-ciDécouverte de type dynamique dans Google Closure Compiler

/** 
* @param {!Array} aArray my array 
*/ 
function actOnArray(aArray) { 

} 

/** 
* @param {*} aObject an arbitrary object 
*/ 
function doSomething(aObject) { 
    // make sure we have an array 
    if ((null != aObject) && Array.isArray(aObject)) { 
    actOnArray(aObject); 
    } 
} 

L'exécution de cette sniplet via la compilation avancée dans le compilateur de fermeture google donne le message d'avertissement suivant:

JSC_TYPE_MISMATCH: actual parameter 1 of actOnArray does not match formal parameter 
found : * 
required: Array at line 14 character 15 
    actOnArray(aObject); 

Cet avertissement est logique, puisque le compilateur ne sait rien au sujet de la sémantique de mon type de vérification.

Ma question est: comment puis-je annoter le code pour dire au compilateur qu'à un certain point j'ai acquis des informations sur un type. Dans cet exemple, je voudrais dire à l'intérieur du bloc if que je sais maintenant avec certitude que le paramètre aObject est de type! Array.

Répondre

1

Pour certains modèles, le compilateur peut serrer automatiquement les types dans les essais:

// ==ClosureCompiler== 
// @compilation_level ADVANCED_OPTIMIZATIONS 
// @output_file_name default.js 
// @warning_level VERBOSE 
// ==/ClosureCompiler== 


/** @param {*} data */ 
function log(data) { 
    if (data && data instanceof Array) { 
    logArray(data); 
    } else { 
    console.log(data); 
    } 
} 

/** @param {!Array} data */ 
function logArray(data) { 
    for(var i = 0; i < data.length; i++) { 
    log(data[i]); 
    } 
} 

log([1, 2, 3]); 

Cependant, dans de nombreux cas, il ne peut pas. Dans ces cas, vous devez taper cast:

actOnArray(/** @type {!Array} */ (aObject)); 

Notez la parenthèse extra - ils sont nécessaires