2015-07-17 2 views
1

Я иногда сталкиваюсь с ситуацией, когда у меня есть объект JavaScript неизвестного типа. Затем я выполняю проверку типа в скрипте и вызываю соответствующие функции в зависимости от обнаруженного типа. , например. как этоОткрытие динамического типа в компиляторе Google Closure

/** 
* @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); 
    } 
} 

Запуск этого sniplet с помощью передовых компиляции в Google Closure Compiler, получает следующее предупреждающего сообщения:

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

Это предупреждение имеет смысл, поскольку компилятор ничего не знаю о семантике не знает, мои type проверка.

Мой вопрос: как я могу комментировать код, чтобы сообщить компилятору, что в определенный момент я получил информацию о типе. В этом примере я хотел бы сказать внутри блока if, что теперь я точно знаю, что параметр aObject имеет тип! Array.

ответ

1

Для некоторых моделей, компилятор может автоматически затягивайте типы в тестах:

// ==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]); 

Однако, во многих случаях не может. В тех случаях, вам нужно ввести роли:

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

примечания дополнительных скобок - они необходимы

Смежные вопросы