6

Googleクロージャを試しています。具体的には、タイプセーフティを実施するための注釈を付けることです。Google閉鎖注釈が私に間違っているとは言わない

は、ここでは、コードの...コンパイラはそれがあることを私に教えてくれないでしょうが、私は、何か間違ったことをしたテストするには:だから

// ==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

クロージャコンパイラは、warning levelsを使用して、コンパイルプロセス中に有効になっているチェックを決定します。 3警告レベルは次のとおりです。

    • 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 options.checkTypes = true;のみVERBOSE警告レベルに設定されていることを

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

    注意してください。 が指摘しているように、コンパイルレベルADVANCED_OPTIMIZATIONSを使用している場合は、型チェックも有効です。

    はまた、警告のクラスが閉鎖コンパイラアプリケーション(JARファイル)を使用して、コンパイラフラグを個別に制御することができる。--jscomp_warning

    • --jscomp_off
    • --jscomp_error

    指定できる警告クラスは次のとおりです。

    • accessControls
    • es5Strict
    • duplicateMessage
    • を廃止予定
    • ambiguousFunctionDecl
    • checkRegExp
    • checkTypes
    • checkVars
    • CONST
    • constantProperty
    • 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

    うーん、あなたは全く正しいです。単純な最適化のチェックをしない理由はありますか?高度なので、私の味のために少しあまりにも積極的です。 –

    +0

    私は、高度な最適化を使って自分のCard.js(私のカードオブジェクトを含む)をコンパイルしようとしました。そして、私は、それはそれを取り除く。私は空のファイルを取得します。なぜなら、どこでも使用されていることが分かりませんからです。しかし、それは他のjsファイル内でのみ使用されています... –

    +0

    私はメモ帳の中から呼び出されたjarファイルを使用しています+ "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 " –

    関連する問題