6

Я пытаюсь Google Closure, в частности аннотирующий материал для обеспечения безопасности типов. Для того, чтобы проверить, я сделал что-то не так, хотя компилятор не скажет мне, что это ...Google Closure Annotating не скажет мне, что я ошибаюсь

Вот код:

// ==ClosureCompiler== 
// @output_file_name default.js 
// @compilation_level SIMPLE_OPTIMIZATIONS 
// ==/ClosureCompiler== 

/** 
* A card. 
* @constructor 
* @param {String} cardName The exact name of the card 
* @param {Kinetic.Layer} layer The layer for the card 
*/ 
function CardObject(cardName, layer) 
{ 
    /** @type {Number} */ 
    var number = cardName; 
} 

Итак, у меня есть переменная number, которую я говорю это Number, и я пытаюсь присвоить ему строку. Это не возможно, не так ли? Хотя компилятор мне не скажет, что ...

Почему бы мне не сказать, что это неправильно?

ответ

7

Closure Compiler использует warning levels, чтобы определить, какие проверки включены во время процесса компиляции. Три уровня предупреждений являются:

  • QUIET
  • DEFAULT
  • VERBOSE

Например, используя уровень компиляции SIMPLE_OPTIMIZATIONS, вы все равно получите тип проверки предупреждений с уровнем предупреждения, установленный в VERBOSE ,

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

/** 
* A card. 
* @constructor 
* @param {String} cardName The exact name of the card 
* @param {Kinetic.Layer} layer The layer for the card 
*/ 
function CardObject(cardName, layer) 
{ 
    /** @type {Number} */ 
    var number = cardName; 
} 

Выход

Number of warnings: 2 

JSC_TYPE_PARSE_ERROR: Bad type annotation. Unknown type Kinetic.Layer at line 5 
character 10 
* @param {Kinetic.Layer} layer The layer for the card 
     ^
JSC_TYPE_MISMATCH: initializing variable 
found : (String|null|undefined) 
required: (Number|null) at line 10 character 13 
var number = cardName; 
      ^

Чтобы точно понять, какие проверки связаны с каждым уровнем предупреждения, здесь соответствующий код из WarningLevels.java.

QUIET

/** 
* Silence all non-essential warnings. 
*/ 
private static void silenceAllWarnings(CompilerOptions options) { 
    // Just use a ShowByPath warnings guard, so that we don't have 
    // to maintain a separate class of warnings guards for silencing warnings. 
    options.addWarningsGuard(
     new ShowByPathWarningsGuard(
      "the_longest_path_that_cannot_be_expressed_as_a_string")); 

    // Allow passes that aren't going to report anything to be skipped. 

    options.checkRequires = CheckLevel.OFF; 
    options.checkProvides = CheckLevel.OFF; 
    options.checkMissingGetCssNameLevel = CheckLevel.OFF; 
    options.aggressiveVarCheck = CheckLevel.OFF; 
    options.checkTypes = false; 
    options.setWarningLevel(DiagnosticGroups.CHECK_TYPES, CheckLevel.OFF); 
    options.checkUnreachableCode = CheckLevel.OFF; 
    options.checkMissingReturn = CheckLevel.OFF; 
    options.setWarningLevel(DiagnosticGroups.ACCESS_CONTROLS, CheckLevel.OFF); 
    options.setWarningLevel(DiagnosticGroups.CONST, CheckLevel.OFF); 
    options.setWarningLevel(DiagnosticGroups.CONSTANT_PROPERTY, CheckLevel.OFF); 
    options.checkGlobalNamesLevel = CheckLevel.OFF; 
    options.checkSuspiciousCode = false; 
    options.checkGlobalThisLevel = CheckLevel.OFF; 
    options.setWarningLevel(DiagnosticGroups.GLOBAL_THIS, CheckLevel.OFF); 
    options.setWarningLevel(DiagnosticGroups.ES5_STRICT, CheckLevel.OFF); 
    options.checkCaja = false; 
} 

DEFAULT

/** 
* Add the default checking pass to the compilation options. 
* @param options The CompilerOptions object to set the options on. 
*/ 
private static void addDefaultWarnings(CompilerOptions options) { 
    options.checkSuspiciousCode = true; 
    options.checkUnreachableCode = CheckLevel.WARNING; 
    options.checkControlStructures = true; 
} 

VERBOSE

/** 
* Add all the check pass that are possibly relevant to a non-googler. 
* @param options The CompilerOptions object to set the options on. 
*/ 
private static void addVerboseWarnings(CompilerOptions options) { 
    addDefaultWarnings(options); 

    // checkSuspiciousCode needs to be enabled for CheckGlobalThis to get run. 
    options.checkSuspiciousCode = true; 
    options.checkGlobalThisLevel = CheckLevel.WARNING; 
    options.checkSymbols = true; 
    options.checkMissingReturn = CheckLevel.WARNING; 

    // checkTypes has the side-effect of asserting that the 
    // correct number of arguments are passed to a function. 
    // Because the CodingConvention used with the web service does not provide a 
    // way for optional arguments to be specified, these warnings may result in 
    // false positives. 
    options.checkTypes = true; 
    options.checkGlobalNamesLevel = CheckLevel.WARNING; 
    options.aggressiveVarCheck = CheckLevel.WARNING; 
    options.setWarningLevel(
     DiagnosticGroups.MISSING_PROPERTIES, CheckLevel.WARNING); 
    options.setWarningLevel(
     DiagnosticGroups.DEPRECATED, CheckLevel.WARNING); 
} 

Обратите внимание, что options.checkTypes = true; устанавливается только для VERBOSE уровня предупреждения. Как указывал Speransky Danil, проверка типов также включена при использовании уровня компиляции ADVANCED_OPTIMIZATIONS.

Кроме того, классы предупреждений могут управляться индивидуально с приложением Closure Compiler (файл JAR), используя флаги компилятора:

  • --jscomp_off
  • --jscomp_warning
  • --jscomp_error

Классы предупреждения, которые могут быть указаны, следующие:

  • accessControls
  • ambiguousFunctionDecl
  • checkRegExp
  • checkTypes
  • checkVars
  • константные
  • constantProperty
  • устаревшим
  • duplicateMessage
  • es5Strict
  • externsValidation
  • fileoverviewTags
  • globalThis
  • internetExplorerChecks
  • invalidCasts
  • missingProperties
  • nonStandardJsDocs
  • strictModuleDepCheck
  • typeInvalidation
  • undefinedNames
  • undefinedVars
  • unknownDefines
  • uselessCode
  • видимость

Например, предупреждения проверочные типа могут быть активированы по отдельности:

--jscomp_warning=checkTypes 
+0

Хорошо, это невероятные ответы. Спасибо, я многому научился, и теперь я могу использовать простую оптимизацию с проверкой типов: D Спасибо! –

0

Вы должны только выбрать расширенный режим оптимизации:

// @compilation_level ADVANCED_OPTIMIZATIONS 

Тогда для этого кода, например:

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

/** 
* @param {String} str 
*/ 
function func(str) { 
    /** @type {Number} */ 
    var num = str; 
} 

Там будет предупреждение:

JSC_TYPE_MISMATCH: initializing variable 
found : (String|null) 
required: (Number|null) at line 6 character 10 
var num = str; 

Я думаю, вы знаете, но если нет, вы можете играть с ним онлайн: http://closure-compiler.appspot.com/home

+0

Хм, вы совершенно правы. Есть ли причина, почему она не делает проверку простой оптимизации? Так как продвинутый язык слишком агрессивен для моего вкуса. У меня есть несколько js-файлов и расширенные имена имен функций, по-видимому (только что начали использовать закрытие, так что может быть неправильно) –

+0

Я просто попытался скомпилировать свой Card.js (который содержит объекты моего карточного объекта) с расширенной оптимизацией и он скомпилирует его. Я получаю пустой файл, я предполагаю, потому что он не может найти, что он используется где угодно. Но он используется только в другом файле js ... –

+0

Я использую файл jar, вызываемый из Notepad ++: «java -jar» C: \ Users \ Pablo \ Documents \ Google Closure \ compiler.jar "- -js "$ (FULL_CURRENT_PATH)" --js_output_file "$ (FULL_CURRENT_PATH) .compiled" --compilation_level ADVANCED_OPTIMIZATIONS " –